@flowgram-vue/history-storage 0.2.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.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
4
+ Copyright (c) 2026 Crayon
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,311 @@
1
+ 'use strict';
2
+
3
+ var core = require('@flowgram-vue/core');
4
+ var inversify = require('inversify');
5
+ var utils = require('@flowgram-vue/utils');
6
+ var history = require('@flowgram-vue/history');
7
+ var Dexie = require('dexie');
8
+ var lodashEs = require('lodash-es');
9
+ var vue = require('vue');
10
+
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ var Dexie__default = /*#__PURE__*/_interopDefault(Dexie);
14
+
15
+ var __defProp = Object.defineProperty;
16
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
17
+ var __decorateClass = (decorators, target, key, kind) => {
18
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
19
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
20
+ if (decorator = decorators[i])
21
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
22
+ if (kind && result) __defProp(target, key, result);
23
+ return result;
24
+ };
25
+ var HistoryDatabase = class extends Dexie__default.default {
26
+ constructor(databaseName = "ide-history-storage") {
27
+ super(databaseName);
28
+ this.resourceStorageLimit = 100;
29
+ this.version(1).stores({
30
+ history: "++id, &uuid, resourceURI",
31
+ operation: "++id, &uuid, historyId, uri, resourceURI"
32
+ });
33
+ }
34
+ /**
35
+ * 某个uri下所有的history记录
36
+ * @param resourceURI 资源uri
37
+ * @returns
38
+ */
39
+ allHistoryByResourceURI(resourceURI) {
40
+ return this.history.where({ resourceURI }).toArray();
41
+ }
42
+ /**
43
+ * 根据uuid获取历史
44
+ * @param uuid
45
+ * @returns
46
+ */
47
+ getHistoryByUUID(uuid) {
48
+ return this.history.get({ uuid });
49
+ }
50
+ /**
51
+ * 某个uri下所有的operation记录
52
+ * @param resourceURI 资源uri
53
+ * @returns
54
+ */
55
+ allOperationByResourceURI(resourceURI) {
56
+ return this.operation.where({ resourceURI }).toArray();
57
+ }
58
+ /**
59
+ * 添加历史记录
60
+ * @param history 历史记录
61
+ * @param operations 操作记录
62
+ * @returns
63
+ */
64
+ addHistoryRecord(history, operations) {
65
+ return this.transaction("rw", this.history, this.operation, async () => {
66
+ const count = await this.history.where({ resourceURI: history.resourceURI }).count();
67
+ if (count >= this.resourceStorageLimit) {
68
+ const limit = count - this.resourceStorageLimit;
69
+ const items = await this.history.where({ resourceURI: history.resourceURI }).limit(limit).toArray();
70
+ const ids = items.map((i) => i.id);
71
+ const uuid = items.map((i) => i.uuid);
72
+ await Promise.all([
73
+ this.history.bulkDelete(ids),
74
+ ...uuid.map(async (uuid2) => {
75
+ await this.operation.where({ historyId: uuid2 }).delete();
76
+ })
77
+ ]);
78
+ }
79
+ return Promise.all([this.history.add(history), this.operation.bulkAdd(operations)]);
80
+ });
81
+ }
82
+ /**
83
+ * 更新历史记录
84
+ * @param historyRecord
85
+ * @returns
86
+ */
87
+ async updateHistoryByUUID(uuid, historyRecord) {
88
+ const history = await this.getHistoryByUUID(uuid);
89
+ if (!history) {
90
+ console.warn("no history record found");
91
+ return;
92
+ }
93
+ return this.history.update(history.id, historyRecord);
94
+ }
95
+ /**
96
+ * 添加操作记录
97
+ * @param record 操作记录
98
+ * @returns
99
+ */
100
+ addOperationRecord(record) {
101
+ return this.operation.add(record);
102
+ }
103
+ /**
104
+ * 更新操作记录
105
+ * @param record 操作记录
106
+ * @returns
107
+ */
108
+ async updateOperationRecord(record) {
109
+ const op = await this.operation.where({ uuid: record.uuid }).first();
110
+ if (!op) {
111
+ console.warn("no operation record found");
112
+ return;
113
+ }
114
+ return this.operation.put({
115
+ id: op.id,
116
+ ...record
117
+ });
118
+ }
119
+ /**
120
+ * 重置数据库
121
+ * @returns
122
+ */
123
+ reset() {
124
+ return this.transaction("rw", this.history, this.operation, async () => {
125
+ await Promise.all(this.tables.map((table) => table.clear()));
126
+ });
127
+ }
128
+ /**
129
+ * 清空某个资源下所有的数据
130
+ * @param resourceURI
131
+ * @returns
132
+ */
133
+ resetByResourceURI(resourceURI) {
134
+ return this.transaction("rw", this.history, this.operation, async () => {
135
+ await Promise.all(this.tables.map((table) => table.where({ resourceURI }).delete()));
136
+ });
137
+ }
138
+ };
139
+
140
+ // src/history-storage-manager.ts
141
+ exports.HistoryStorageManager = class HistoryStorageManager {
142
+ constructor() {
143
+ this._toDispose = new utils.DisposableCollection();
144
+ }
145
+ /**
146
+ * 初始化
147
+ * @param ctx
148
+ */
149
+ onInit(_ctx, opts) {
150
+ this.db = new HistoryDatabase(opts?.databaseName);
151
+ if (opts?.resourceStorageLimit) {
152
+ this.db.resourceStorageLimit = opts.resourceStorageLimit;
153
+ }
154
+ this._toDispose.push(
155
+ this.historyManager.historyStack.onChange((event) => {
156
+ if (event.type === history.HistoryStackChangeType.ADD) {
157
+ const [history, operations] = this.historyItemToRecord(event.service, event.value);
158
+ this.db.addHistoryRecord(history, operations).catch(console.error);
159
+ }
160
+ if ([history.HistoryStackChangeType.ADD_OPERATION, history.HistoryStackChangeType.UPDATE_OPERATION].includes(
161
+ event.type
162
+ )) {
163
+ const {
164
+ service,
165
+ value: { historyItem }
166
+ } = event;
167
+ this.db.updateHistoryByUUID(historyItem.id, {
168
+ resourceJSON: service.getSnapshot() || ""
169
+ }).catch(console.error);
170
+ }
171
+ if (event.type === history.HistoryStackChangeType.ADD_OPERATION) {
172
+ const operationRecord = this.historyOperationToRecord(
173
+ event.value.historyItem,
174
+ event.value.operation
175
+ );
176
+ this.db.addOperationRecord(operationRecord).catch(console.error);
177
+ }
178
+ if (event.type === history.HistoryStackChangeType.UPDATE_OPERATION) {
179
+ const operationRecord = this.historyOperationToRecord(
180
+ event.value.historyItem,
181
+ event.value.operation
182
+ );
183
+ this.db.updateOperationRecord(operationRecord).catch(console.error);
184
+ }
185
+ })
186
+ );
187
+ }
188
+ /**
189
+ * 内存历史转数据表记录
190
+ * @param historyItem
191
+ * @returns
192
+ */
193
+ historyItemToRecord(historyService, historyItem) {
194
+ const operations = historyItem.operations.map(
195
+ (op) => this.historyOperationToRecord(historyItem, op)
196
+ );
197
+ return [
198
+ {
199
+ uuid: historyItem.id,
200
+ timestamp: historyItem.timestamp,
201
+ type: historyItem.type,
202
+ resourceURI: historyItem.uri?.toString() || "",
203
+ resourceJSON: historyService.getSnapshot() || ""
204
+ },
205
+ operations
206
+ ];
207
+ }
208
+ /**
209
+ * 内存操作转数据表操作
210
+ * @param historyItem
211
+ * @param op
212
+ * @returns
213
+ */
214
+ historyOperationToRecord(historyItem, op) {
215
+ return {
216
+ uuid: op.id,
217
+ type: op.type,
218
+ timestamp: op.timestamp,
219
+ label: op.label || "",
220
+ uri: op?.uri?.toString() || "",
221
+ resourceURI: historyItem.uri?.toString() || "",
222
+ description: op.description || "",
223
+ value: JSON.stringify(op.value),
224
+ historyId: historyItem.id
225
+ };
226
+ }
227
+ /**
228
+ * 销毁
229
+ */
230
+ dispose() {
231
+ this._toDispose.dispose();
232
+ }
233
+ };
234
+ __decorateClass([
235
+ inversify.inject(history.HistoryManager)
236
+ ], exports.HistoryStorageManager.prototype, "historyManager", 2);
237
+ exports.HistoryStorageManager = __decorateClass([
238
+ inversify.injectable()
239
+ ], exports.HistoryStorageManager);
240
+ var HistoryStorageContainerModule = new inversify.ContainerModule((bind) => {
241
+ bind(exports.HistoryStorageManager).toSelf().inSingletonScope();
242
+ });
243
+
244
+ // src/create-history-storage-plugin.ts
245
+ var createHistoryStoragePlugin = core.definePluginCreator({
246
+ onBind: ({ bind, rebind }) => {
247
+ },
248
+ onInit(ctx, opts) {
249
+ const historyStorageManager = ctx.get(exports.HistoryStorageManager);
250
+ historyStorageManager.onInit(ctx, opts);
251
+ },
252
+ onDispose(ctx) {
253
+ const historyStorageManager = ctx.get(exports.HistoryStorageManager);
254
+ historyStorageManager.dispose();
255
+ },
256
+ containerModules: [HistoryStorageContainerModule]
257
+ });
258
+ function useStorageHistoryItems(historyStorageManager, resourceURI) {
259
+ const state = vue.reactive({
260
+ items: []
261
+ });
262
+ vue.watchEffect((onCleanup) => {
263
+ const uri = vue.toValue(resourceURI);
264
+ const observable = Dexie.liveQuery(async () => {
265
+ const [historyItems, operations] = await Promise.all([
266
+ historyStorageManager.db.allHistoryByResourceURI(uri),
267
+ historyStorageManager.db.allOperationByResourceURI(uri)
268
+ ]);
269
+ const grouped = lodashEs.groupBy(
270
+ operations.map((o) => ({
271
+ id: o.uuid,
272
+ timestamp: o.timestamp,
273
+ type: o.type,
274
+ label: o.label,
275
+ description: o.description,
276
+ value: o.value ? JSON.parse(o.value) : void 0,
277
+ uri: o.uri,
278
+ historyId: o.historyId
279
+ })),
280
+ "historyId"
281
+ );
282
+ return historyItems.sort((a, b) => b.id - a.id).map(
283
+ (historyItem) => ({
284
+ id: historyItem.uuid,
285
+ type: historyItem.type,
286
+ timestamp: historyItem.timestamp,
287
+ operations: grouped[historyItem.uuid] || [],
288
+ time: history.HistoryStack.dateFormat(historyItem.timestamp),
289
+ uri: historyItem.resourceURI
290
+ })
291
+ );
292
+ });
293
+ const subscription = observable.subscribe({
294
+ next: (value) => {
295
+ state.items = value || [];
296
+ },
297
+ error: (err) => {
298
+ console.error(err);
299
+ }
300
+ });
301
+ onCleanup(() => subscription.unsubscribe());
302
+ });
303
+ return state;
304
+ }
305
+
306
+ exports.HistoryDatabase = HistoryDatabase;
307
+ exports.HistoryStorageContainerModule = HistoryStorageContainerModule;
308
+ exports.createHistoryStoragePlugin = createHistoryStoragePlugin;
309
+ exports.useStorageHistoryItems = useStorageHistoryItems;
310
+ //# sourceMappingURL=index.cjs.map
311
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/history-database.ts","../src/history-storage-manager.ts","../src/history-storage-container-module.ts","../src/create-history-storage-plugin.ts","../src/use-storage-hisotry-items.ts"],"names":["Dexie","uuid","HistoryStorageManager","DisposableCollection","HistoryStackChangeType","inject","HistoryManager","injectable","ContainerModule","definePluginCreator","reactive","watchEffect","toValue","liveQuery","groupBy","HistoryStack"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport Dexie, { type Table } from 'dexie';\n\nimport { HistoryOperationRecord, HistoryRecord } from './types';\n\n/**\n * 历史数据库\n */\nexport class HistoryDatabase extends Dexie {\n readonly history: Table<HistoryRecord>;\n\n readonly operation: Table<HistoryOperationRecord>;\n\n resourceStorageLimit: number = 100;\n\n constructor(databaseName: string = 'ide-history-storage') {\n super(databaseName);\n this.version(1).stores({\n history: '++id, &uuid, resourceURI',\n operation: '++id, &uuid, historyId, uri, resourceURI',\n });\n }\n\n /**\n * 某个uri下所有的history记录\n * @param resourceURI 资源uri\n * @returns\n */\n allHistoryByResourceURI(resourceURI: string) {\n return this.history.where({ resourceURI }).toArray();\n }\n\n /**\n * 根据uuid获取历史\n * @param uuid\n * @returns\n */\n getHistoryByUUID(uuid: string) {\n return this.history.get({ uuid });\n }\n\n /**\n * 某个uri下所有的operation记录\n * @param resourceURI 资源uri\n * @returns\n */\n allOperationByResourceURI(resourceURI: string) {\n return this.operation.where({ resourceURI }).toArray();\n }\n\n /**\n * 添加历史记录\n * @param history 历史记录\n * @param operations 操作记录\n * @returns\n */\n addHistoryRecord(history: HistoryRecord, operations: HistoryOperationRecord[]) {\n return this.transaction('rw', this.history, this.operation, async () => {\n const count = await this.history.where({ resourceURI: history.resourceURI }).count();\n if (count >= this.resourceStorageLimit) {\n const limit = count - this.resourceStorageLimit;\n const items = await this.history\n .where({ resourceURI: history.resourceURI })\n .limit(limit)\n .toArray();\n const ids = items.map(i => i.id);\n const uuid = items.map(i => i.uuid);\n await Promise.all([\n this.history.bulkDelete(ids),\n ...uuid.map(async uuid => {\n await this.operation.where({ historyId: uuid }).delete();\n }),\n ]);\n }\n\n return Promise.all([this.history.add(history), this.operation.bulkAdd(operations)]);\n });\n }\n\n /**\n * 更新历史记录\n * @param historyRecord\n * @returns\n */\n async updateHistoryByUUID(uuid: string, historyRecord: Partial<HistoryRecord>) {\n const history = await this.getHistoryByUUID(uuid);\n if (!history) {\n console.warn('no history record found');\n return;\n }\n return this.history.update(history.id, historyRecord);\n }\n\n /**\n * 添加操作记录\n * @param record 操作记录\n * @returns\n */\n addOperationRecord(record: HistoryOperationRecord) {\n return this.operation.add(record);\n }\n\n /**\n * 更新操作记录\n * @param record 操作记录\n * @returns\n */\n async updateOperationRecord(record: HistoryOperationRecord) {\n const op = await this.operation.where({ uuid: record.uuid }).first();\n if (!op) {\n console.warn('no operation record found');\n return;\n }\n return this.operation.put({\n id: op.id,\n ...record,\n });\n }\n\n /**\n * 重置数据库\n * @returns\n */\n reset() {\n return this.transaction('rw', this.history, this.operation, async () => {\n await Promise.all(this.tables.map(table => table.clear()));\n });\n }\n\n /**\n * 清空某个资源下所有的数据\n * @param resourceURI\n * @returns\n */\n resetByResourceURI(resourceURI: string) {\n return this.transaction('rw', this.history, this.operation, async () => {\n await Promise.all(this.tables.map(table => table.where({ resourceURI }).delete()));\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { DisposableCollection } from '@flowgram-vue/utils';\nimport {\n HistoryItem,\n HistoryManager,\n HistoryOperation,\n HistoryStackChangeType,\n HistoryService,\n HistoryStackAddOperationEvent,\n HistoryStackUpdateOperationEvent,\n} from '@flowgram-vue/history';\nimport { PluginContext } from '@flowgram-vue/core';\n\nimport { HistoryOperationRecord, HistoryRecord, HistoryStoragePluginOptions } from './types';\nimport { HistoryDatabase } from './history-database';\n\n/**\n * 历史存储管理\n */\n@injectable()\nexport class HistoryStorageManager {\n private _toDispose = new DisposableCollection();\n\n db: HistoryDatabase;\n\n @inject(HistoryManager)\n protected historyManager: HistoryManager;\n\n /**\n * 初始化\n * @param ctx\n */\n onInit(_ctx: PluginContext, opts: HistoryStoragePluginOptions) {\n this.db = new HistoryDatabase(opts?.databaseName);\n\n if (opts?.resourceStorageLimit) {\n this.db.resourceStorageLimit = opts.resourceStorageLimit;\n }\n\n this._toDispose.push(\n this.historyManager.historyStack.onChange(event => {\n if (event.type === HistoryStackChangeType.ADD) {\n const [history, operations] = this.historyItemToRecord(event.service, event.value);\n this.db.addHistoryRecord(history, operations).catch(console.error);\n }\n\n // operation merge的时候需要更新snapshot\n if (\n [HistoryStackChangeType.ADD_OPERATION, HistoryStackChangeType.UPDATE_OPERATION].includes(\n event.type,\n )\n ) {\n const {\n service,\n value: { historyItem },\n } = event as HistoryStackAddOperationEvent | HistoryStackUpdateOperationEvent;\n // 更新快照\n this.db\n .updateHistoryByUUID(historyItem.id, {\n resourceJSON: service.getSnapshot() || '',\n })\n .catch(console.error);\n }\n\n if (event.type === HistoryStackChangeType.ADD_OPERATION) {\n const operationRecord: HistoryOperationRecord = this.historyOperationToRecord(\n event.value.historyItem,\n event.value.operation,\n );\n this.db.addOperationRecord(operationRecord).catch(console.error);\n }\n if (event.type === HistoryStackChangeType.UPDATE_OPERATION) {\n const operationRecord: HistoryOperationRecord = this.historyOperationToRecord(\n event.value.historyItem,\n event.value.operation,\n );\n this.db.updateOperationRecord(operationRecord).catch(console.error);\n }\n }),\n );\n }\n\n /**\n * 内存历史转数据表记录\n * @param historyItem\n * @returns\n */\n historyItemToRecord(\n historyService: HistoryService,\n historyItem: HistoryItem,\n ): [HistoryRecord, HistoryOperationRecord[]] {\n const operations = historyItem.operations.map(op =>\n this.historyOperationToRecord(historyItem, op),\n );\n\n return [\n {\n uuid: historyItem.id,\n timestamp: historyItem.timestamp,\n type: historyItem.type,\n resourceURI: historyItem.uri?.toString() || '',\n resourceJSON: historyService.getSnapshot() || '',\n },\n operations,\n ];\n }\n\n /**\n * 内存操作转数据表操作\n * @param historyItem\n * @param op\n * @returns\n */\n historyOperationToRecord(historyItem: HistoryItem, op: HistoryOperation): HistoryOperationRecord {\n return {\n uuid: op.id,\n type: op.type,\n timestamp: op.timestamp,\n label: op.label || '',\n uri: op?.uri?.toString() || '',\n resourceURI: historyItem.uri?.toString() || '',\n description: op.description || '',\n value: JSON.stringify(op.value),\n historyId: historyItem.id,\n };\n }\n\n /**\n * 销毁\n */\n dispose() {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { HistoryStorageManager } from './history-storage-manager';\n\nexport const HistoryStorageContainerModule = new ContainerModule(bind => {\n bind(HistoryStorageManager).toSelf().inSingletonScope();\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator } from '@flowgram-vue/core';\n\nimport { HistoryStoragePluginOptions } from './types';\nimport { HistoryStorageManager } from './history-storage-manager';\nimport { HistoryStorageContainerModule } from './history-storage-container-module';\n\nexport const createHistoryStoragePlugin = definePluginCreator<HistoryStoragePluginOptions>({\n onBind: ({ bind, rebind }) => {},\n onInit(ctx, opts): void {\n const historyStorageManager = ctx.get<HistoryStorageManager>(HistoryStorageManager);\n historyStorageManager.onInit(ctx, opts);\n },\n onDispose(ctx) {\n const historyStorageManager = ctx.get<HistoryStorageManager>(HistoryStorageManager);\n historyStorageManager.dispose();\n },\n containerModules: [HistoryStorageContainerModule],\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { liveQuery } from 'dexie';\nimport { groupBy } from 'lodash-es';\nimport { reactive, toValue, watchEffect } from 'vue';\nimport type { MaybeRefOrGetter } from 'vue';\nimport { HistoryItem, HistoryOperation, HistoryStack } from '@flowgram-vue/history';\n\nimport { HistoryStorageManager } from './history-storage-manager';\n\nexport function useStorageHistoryItems(\n historyStorageManager: HistoryStorageManager,\n resourceURI: MaybeRefOrGetter<string>\n): {\n items: HistoryItem[];\n} {\n const state = reactive<{ items: HistoryItem[] }>({\n items: [],\n });\n\n watchEffect((onCleanup) => {\n const uri = toValue(resourceURI);\n const observable = liveQuery(async () => {\n const [historyItems, operations] = await Promise.all([\n historyStorageManager.db.allHistoryByResourceURI(uri),\n historyStorageManager.db.allOperationByResourceURI(uri),\n ]);\n\n const grouped = groupBy<HistoryOperation>(\n operations.map((o) => ({\n id: o.uuid,\n timestamp: o.timestamp,\n type: o.type,\n label: o.label,\n description: o.description,\n value: o.value ? JSON.parse(o.value) : undefined,\n uri: o.uri,\n historyId: o.historyId,\n })),\n 'historyId'\n );\n return historyItems\n .sort((a, b) => (b.id as number) - (a.id as number))\n .map(\n (historyItem) =>\n ({\n id: historyItem.uuid,\n type: historyItem.type,\n timestamp: historyItem.timestamp,\n operations: grouped[historyItem.uuid] || [],\n time: HistoryStack.dateFormat(historyItem.timestamp),\n uri: historyItem.resourceURI,\n }) as HistoryItem\n );\n });\n\n const subscription = observable.subscribe({\n next: (value) => {\n state.items = value || [];\n },\n error: (err) => {\n console.error(err);\n },\n });\n\n onCleanup(() => subscription.unsubscribe());\n });\n\n return state;\n}\n"]}
@@ -0,0 +1,213 @@
1
+ import * as _flowgram_vue_core from '@flowgram-vue/core';
2
+ import { PluginContext } from '@flowgram-vue/core';
3
+ import { MaybeRefOrGetter } from 'vue';
4
+ import { HistoryManager, HistoryService, HistoryItem, HistoryOperation } from '@flowgram-vue/history';
5
+ import * as dexie from 'dexie';
6
+ import dexie__default, { Table } from 'dexie';
7
+ import { ContainerModule } from 'inversify';
8
+
9
+ /**
10
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
11
+ * SPDX-License-Identifier: MIT
12
+ */
13
+ interface HistoryRecord {
14
+ /**
15
+ * 自增id
16
+ */
17
+ id?: number;
18
+ /**
19
+ * 唯一标识
20
+ */
21
+ uuid: string;
22
+ /**
23
+ * 类型 如 push undo redo
24
+ */
25
+ type: string;
26
+ /**
27
+ * 时间戳
28
+ */
29
+ timestamp: number;
30
+ /**
31
+ * 资源uri
32
+ */
33
+ resourceURI: string;
34
+ /**
35
+ * 资源json
36
+ */
37
+ resourceJSON: unknown;
38
+ }
39
+ interface HistoryOperationRecord {
40
+ /**
41
+ * 自增id
42
+ */
43
+ id?: number;
44
+ /**
45
+ * 唯一标识
46
+ */
47
+ uuid: string;
48
+ /**
49
+ * 历史记录唯一标志,记录的uuid
50
+ */
51
+ historyId: string;
52
+ /**
53
+ * 类型,如 addFromNode deleteFromNode
54
+ */
55
+ type: string;
56
+ /**
57
+ * 操作值,不同类型不同,json字符串
58
+ */
59
+ value: string;
60
+ /**
61
+ * uri操作对象uri,如某个node的uri
62
+ */
63
+ uri: string;
64
+ /**
65
+ * 操作资源uri,如某个流程的uri
66
+ */
67
+ resourceURI: string;
68
+ /**
69
+ * 操作显示标题
70
+ */
71
+ label: string;
72
+ /**
73
+ * 操作显示描述
74
+ */
75
+ description: string;
76
+ /**
77
+ * 时间戳
78
+ */
79
+ timestamp: number;
80
+ }
81
+ /**
82
+ * 插件配置
83
+ */
84
+ interface HistoryStoragePluginOptions {
85
+ /**
86
+ * 数据库名称
87
+ */
88
+ databaseName?: string;
89
+ /**
90
+ * 每个资源最大历史记录数量
91
+ */
92
+ resourceStorageLimit?: number;
93
+ }
94
+
95
+ declare const createHistoryStoragePlugin: _flowgram_vue_core.PluginCreator<HistoryStoragePluginOptions>;
96
+
97
+ /**
98
+ * 历史数据库
99
+ */
100
+ declare class HistoryDatabase extends dexie__default {
101
+ readonly history: Table<HistoryRecord>;
102
+ readonly operation: Table<HistoryOperationRecord>;
103
+ resourceStorageLimit: number;
104
+ constructor(databaseName?: string);
105
+ /**
106
+ * 某个uri下所有的history记录
107
+ * @param resourceURI 资源uri
108
+ * @returns
109
+ */
110
+ allHistoryByResourceURI(resourceURI: string): dexie.PromiseExtended<HistoryRecord[]>;
111
+ /**
112
+ * 根据uuid获取历史
113
+ * @param uuid
114
+ * @returns
115
+ */
116
+ getHistoryByUUID(uuid: string): dexie.PromiseExtended<HistoryRecord | undefined>;
117
+ /**
118
+ * 某个uri下所有的operation记录
119
+ * @param resourceURI 资源uri
120
+ * @returns
121
+ */
122
+ allOperationByResourceURI(resourceURI: string): dexie.PromiseExtended<HistoryOperationRecord[]>;
123
+ /**
124
+ * 添加历史记录
125
+ * @param history 历史记录
126
+ * @param operations 操作记录
127
+ * @returns
128
+ */
129
+ addHistoryRecord(history: HistoryRecord, operations: HistoryOperationRecord[]): dexie.PromiseExtended<[any, any]>;
130
+ /**
131
+ * 更新历史记录
132
+ * @param historyRecord
133
+ * @returns
134
+ */
135
+ updateHistoryByUUID(uuid: string, historyRecord: Partial<HistoryRecord>): Promise<number | undefined>;
136
+ /**
137
+ * 添加操作记录
138
+ * @param record 操作记录
139
+ * @returns
140
+ */
141
+ addOperationRecord(record: HistoryOperationRecord): dexie.PromiseExtended<any>;
142
+ /**
143
+ * 更新操作记录
144
+ * @param record 操作记录
145
+ * @returns
146
+ */
147
+ updateOperationRecord(record: HistoryOperationRecord): Promise<any>;
148
+ /**
149
+ * 重置数据库
150
+ * @returns
151
+ */
152
+ reset(): dexie.PromiseExtended<void>;
153
+ /**
154
+ * 清空某个资源下所有的数据
155
+ * @param resourceURI
156
+ * @returns
157
+ */
158
+ resetByResourceURI(resourceURI: string): dexie.PromiseExtended<void>;
159
+ }
160
+
161
+ /**
162
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
163
+ * SPDX-License-Identifier: MIT
164
+ */
165
+
166
+ /**
167
+ * 历史存储管理
168
+ */
169
+ declare class HistoryStorageManager {
170
+ private _toDispose;
171
+ db: HistoryDatabase;
172
+ protected historyManager: HistoryManager;
173
+ /**
174
+ * 初始化
175
+ * @param ctx
176
+ */
177
+ onInit(_ctx: PluginContext, opts: HistoryStoragePluginOptions): void;
178
+ /**
179
+ * 内存历史转数据表记录
180
+ * @param historyItem
181
+ * @returns
182
+ */
183
+ historyItemToRecord(historyService: HistoryService, historyItem: HistoryItem): [HistoryRecord, HistoryOperationRecord[]];
184
+ /**
185
+ * 内存操作转数据表操作
186
+ * @param historyItem
187
+ * @param op
188
+ * @returns
189
+ */
190
+ historyOperationToRecord(historyItem: HistoryItem, op: HistoryOperation): HistoryOperationRecord;
191
+ /**
192
+ * 销毁
193
+ */
194
+ dispose(): void;
195
+ }
196
+
197
+ /**
198
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
199
+ * SPDX-License-Identifier: MIT
200
+ */
201
+
202
+ declare function useStorageHistoryItems(historyStorageManager: HistoryStorageManager, resourceURI: MaybeRefOrGetter<string>): {
203
+ items: HistoryItem[];
204
+ };
205
+
206
+ /**
207
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
208
+ * SPDX-License-Identifier: MIT
209
+ */
210
+
211
+ declare const HistoryStorageContainerModule: ContainerModule;
212
+
213
+ export { HistoryDatabase, type HistoryOperationRecord, type HistoryRecord, HistoryStorageContainerModule, HistoryStorageManager, type HistoryStoragePluginOptions, createHistoryStoragePlugin, useStorageHistoryItems };