@aiao/rxdb 0.0.6 → 0.0.8

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 (176) hide show
  1. package/dist/RxDB.d.ts +119 -18
  2. package/dist/RxDB.d.ts.map +1 -1
  3. package/dist/entity/@TreeEntity.d.ts.map +1 -1
  4. package/dist/entity/EntityBase.d.ts +58 -10
  5. package/dist/entity/EntityBase.d.ts.map +1 -1
  6. package/dist/entity/EntityManager.d.ts +16 -5
  7. package/dist/entity/EntityManager.d.ts.map +1 -1
  8. package/dist/entity/EntityStatus.d.ts +145 -87
  9. package/dist/entity/EntityStatus.d.ts.map +1 -1
  10. package/dist/entity/EntityStatus.interface.d.ts +59 -0
  11. package/dist/entity/EntityStatus.interface.d.ts.map +1 -0
  12. package/dist/entity/TreeEntityBase.d.ts +31 -4
  13. package/dist/entity/TreeEntityBase.d.ts.map +1 -1
  14. package/dist/entity/entity.interface.d.ts +16 -15
  15. package/dist/entity/entity.interface.d.ts.map +1 -1
  16. package/dist/entity/entity.utils.d.ts +21 -0
  17. package/dist/entity/entity.utils.d.ts.map +1 -1
  18. package/dist/entity/many_to_many_entity.d.ts.map +1 -1
  19. package/dist/entity/metadata-options.interface.d.ts +276 -39
  20. package/dist/entity/metadata-options.interface.d.ts.map +1 -1
  21. package/dist/entity/{transition-metadata.d.ts → metadata-transition.d.ts} +1 -1
  22. package/dist/entity/metadata-transition.d.ts.map +1 -0
  23. package/dist/entity/metadata.interface.d.ts +6 -0
  24. package/dist/entity/metadata.interface.d.ts.map +1 -1
  25. package/dist/entity/metadata_cascade_default.d.ts +54 -0
  26. package/dist/entity/metadata_cascade_default.d.ts.map +1 -0
  27. package/dist/entity/proxy.d.ts.map +1 -1
  28. package/dist/entity/relation_helper.d.ts.map +1 -1
  29. package/dist/entity/tree-entity.interface.d.ts +5 -0
  30. package/dist/entity/tree-entity.interface.d.ts.map +1 -0
  31. package/dist/gateway/RxDBTabsGateway.d.ts +52 -0
  32. package/dist/gateway/RxDBTabsGateway.d.ts.map +1 -0
  33. package/dist/gateway/gateway.interface.d.ts +43 -0
  34. package/dist/gateway/gateway.interface.d.ts.map +1 -0
  35. package/dist/index.d.ts +17 -12
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +5791 -1896
  38. package/dist/query/entity_type_dependencies.d.ts +3 -2
  39. package/dist/query/entity_type_dependencies.d.ts.map +1 -1
  40. package/dist/query/merge-update-basic.d.ts +30 -0
  41. package/dist/query/merge-update-basic.d.ts.map +1 -0
  42. package/dist/query/merge-update-tree.d.ts +86 -0
  43. package/dist/query/merge-update-tree.d.ts.map +1 -0
  44. package/dist/query/merge-update.utils.d.ts +52 -0
  45. package/dist/query/merge-update.utils.d.ts.map +1 -0
  46. package/dist/query/merge_create.d.ts +2 -2
  47. package/dist/query/merge_create.d.ts.map +1 -1
  48. package/dist/query/merge_remove.d.ts +2 -15
  49. package/dist/query/merge_remove.d.ts.map +1 -1
  50. package/dist/query/merge_update.d.ts +2 -2
  51. package/dist/query/merge_update.d.ts.map +1 -1
  52. package/dist/query/need_refresh_create.d.ts +4 -4
  53. package/dist/query/need_refresh_create.d.ts.map +1 -1
  54. package/dist/query/need_refresh_remove.d.ts +2 -2
  55. package/dist/query/need_refresh_remove.d.ts.map +1 -1
  56. package/dist/query/need_refresh_update.d.ts +4 -4
  57. package/dist/query/need_refresh_update.d.ts.map +1 -1
  58. package/dist/query/query-matching.utils.d.ts +18 -2
  59. package/dist/query/query-matching.utils.d.ts.map +1 -1
  60. package/dist/query/query-relation.utils.d.ts +44 -0
  61. package/dist/query/query-relation.utils.d.ts.map +1 -0
  62. package/dist/query/query-rules-builder.d.ts +68 -0
  63. package/dist/query/query-rules-builder.d.ts.map +1 -0
  64. package/dist/query/query-tree.utils.d.ts +54 -0
  65. package/dist/query/query-tree.utils.d.ts.map +1 -0
  66. package/dist/repository/QueryManager.d.ts +23 -1
  67. package/dist/repository/QueryManager.d.ts.map +1 -1
  68. package/dist/repository/QueryTask.d.ts +42 -5
  69. package/dist/repository/QueryTask.d.ts.map +1 -1
  70. package/dist/repository/Repository.d.ts +24 -35
  71. package/dist/repository/Repository.d.ts.map +1 -1
  72. package/dist/repository/RepositoryBase.d.ts +5 -3
  73. package/dist/repository/RepositoryBase.d.ts.map +1 -1
  74. package/dist/repository/TreeRepository.d.ts +28 -1
  75. package/dist/repository/TreeRepository.d.ts.map +1 -1
  76. package/dist/repository/fingerprint.utils.d.ts +28 -0
  77. package/dist/repository/fingerprint.utils.d.ts.map +1 -0
  78. package/dist/repository/query-options.interface.d.ts +50 -19
  79. package/dist/repository/query-options.interface.d.ts.map +1 -1
  80. package/dist/repository/query.interface.d.ts +70 -25
  81. package/dist/repository/query.interface.d.ts.map +1 -1
  82. package/dist/repository/relation-query.interface.d.ts +19 -0
  83. package/dist/repository/relation-query.interface.d.ts.map +1 -1
  84. package/dist/repository/repository.interface.d.ts +5 -8
  85. package/dist/repository/repository.interface.d.ts.map +1 -1
  86. package/dist/repository/tree-repository.interface.d.ts +29 -2
  87. package/dist/repository/tree-repository.interface.d.ts.map +1 -1
  88. package/dist/rxdb-adapter.d.ts +96 -14
  89. package/dist/rxdb-adapter.d.ts.map +1 -1
  90. package/dist/rxdb-events.d.ts +316 -172
  91. package/dist/rxdb-events.d.ts.map +1 -1
  92. package/dist/rxdb-plugin.d.ts +2 -2
  93. package/dist/rxdb-plugin.d.ts.map +1 -1
  94. package/dist/rxdb-utils.d.ts +15 -8
  95. package/dist/rxdb-utils.d.ts.map +1 -1
  96. package/dist/rxdb.interface.d.ts +4 -0
  97. package/dist/rxdb.interface.d.ts.map +1 -1
  98. package/dist/rxdb.private.d.ts +5 -0
  99. package/dist/rxdb.private.d.ts.map +1 -1
  100. package/dist/schema/SchemaManager.d.ts +1 -0
  101. package/dist/schema/SchemaManager.d.ts.map +1 -1
  102. package/dist/system/branch.d.ts +124 -7
  103. package/dist/system/branch.d.ts.map +1 -1
  104. package/dist/system/change.d.ts +605 -30
  105. package/dist/system/change.d.ts.map +1 -1
  106. package/dist/system/migration.d.ts +61 -11
  107. package/dist/system/migration.d.ts.map +1 -1
  108. package/dist/system/repository-sync.d.ts +95 -0
  109. package/dist/system/repository-sync.d.ts.map +1 -0
  110. package/dist/system/system.interface.d.ts +25 -0
  111. package/dist/system/system.interface.d.ts.map +1 -0
  112. package/dist/system/types.d.ts +233 -120
  113. package/dist/system/types.d.ts.map +1 -1
  114. package/dist/system/types.local.d.ts +156 -0
  115. package/dist/system/types.local.d.ts.map +1 -0
  116. package/dist/system/types.remote.d.ts +103 -0
  117. package/dist/system/types.remote.d.ts.map +1 -0
  118. package/dist/version/HistoryManager.d.ts +238 -0
  119. package/dist/version/HistoryManager.d.ts.map +1 -0
  120. package/dist/version/LWWConflictResolver.d.ts +41 -0
  121. package/dist/version/LWWConflictResolver.d.ts.map +1 -0
  122. package/dist/version/VersionManager.d.ts +407 -0
  123. package/dist/version/VersionManager.d.ts.map +1 -0
  124. package/dist/version/VersionManager.interface.d.ts +428 -0
  125. package/dist/version/VersionManager.interface.d.ts.map +1 -0
  126. package/dist/version/VersionManager.utils.d.ts +14 -0
  127. package/dist/version/VersionManager.utils.d.ts.map +1 -0
  128. package/dist/version/bulk-sync.d.ts +97 -0
  129. package/dist/version/bulk-sync.d.ts.map +1 -0
  130. package/dist/version/check-repository-updates.d.ts +53 -0
  131. package/dist/version/check-repository-updates.d.ts.map +1 -0
  132. package/dist/version/compact-changes.d.ts +45 -0
  133. package/dist/version/compact-changes.d.ts.map +1 -0
  134. package/dist/version/conflict.d.ts +75 -0
  135. package/dist/version/conflict.d.ts.map +1 -0
  136. package/dist/version/create_branch.d.ts +13 -0
  137. package/dist/version/create_branch.d.ts.map +1 -0
  138. package/dist/version/dependency-graph.d.ts +132 -0
  139. package/dist/version/dependency-graph.d.ts.map +1 -0
  140. package/dist/version/find_switch_branch_step.d.ts +53 -0
  141. package/dist/version/find_switch_branch_step.d.ts.map +1 -0
  142. package/dist/version/get-all-repository-sync-status.d.ts +58 -0
  143. package/dist/version/get-all-repository-sync-status.d.ts.map +1 -0
  144. package/dist/version/get-repository-sync-status.d.ts +74 -0
  145. package/dist/version/get-repository-sync-status.d.ts.map +1 -0
  146. package/dist/version/pull-repository.d.ts +99 -0
  147. package/dist/version/pull-repository.d.ts.map +1 -0
  148. package/dist/version/pull.d.ts +11 -0
  149. package/dist/version/pull.d.ts.map +1 -0
  150. package/dist/version/push-repository.d.ts +93 -0
  151. package/dist/version/push-repository.d.ts.map +1 -0
  152. package/dist/version/push.d.ts +11 -0
  153. package/dist/version/push.d.ts.map +1 -0
  154. package/dist/version/remove_branch.d.ts +8 -0
  155. package/dist/version/remove_branch.d.ts.map +1 -0
  156. package/dist/version/switch_branch_actions.d.ts +17 -0
  157. package/dist/version/switch_branch_actions.d.ts.map +1 -0
  158. package/dist/version/sync-repository.d.ts +57 -0
  159. package/dist/version/sync-repository.d.ts.map +1 -0
  160. package/dist/version/sync-type-utils.d.ts +145 -0
  161. package/dist/version/sync-type-utils.d.ts.map +1 -0
  162. package/dist/version/topological-sort.d.ts +70 -0
  163. package/dist/version/topological-sort.d.ts.map +1 -0
  164. package/dist/version/version.utils.d.ts +4 -0
  165. package/dist/version/version.utils.d.ts.map +1 -0
  166. package/package.json +4 -4
  167. package/README.md +0 -1
  168. package/dist/entity/@GraphEntity.d.ts +0 -8
  169. package/dist/entity/@GraphEntity.d.ts.map +0 -1
  170. package/dist/entity/GraphEntityBase.d.ts +0 -10
  171. package/dist/entity/GraphEntityBase.d.ts.map +0 -1
  172. package/dist/entity/graph_edge_entity.d.ts +0 -5
  173. package/dist/entity/graph_edge_entity.d.ts.map +0 -1
  174. package/dist/entity/transition-metadata.d.ts.map +0 -1
  175. package/dist/system/VersionManager.d.ts +0 -35
  176. package/dist/system/VersionManager.d.ts.map +0 -1
@@ -1,75 +1,650 @@
1
- import { ENTITY_STATIC_TYPES, UUID } from '../entity/entity.interface.js';
2
- import { RxDBChangeStaticTypes } from './types.js';
1
+ import { Observable } from 'rxjs';
2
+ import { ENTITY_STATIC_TYPES, RelationEntityObservable, UUID } from '../entity/entity.interface.js';
3
+ import { CountOptions, FindAllOptions, FindByCursorOptions, FindOneOptions, FindOneOrFailOptions, FindOptions } from '../repository/query-options.interface.js';
4
+ import { RxDBBranch } from './branch.js';
5
+ import { IRxDBChange } from './system.interface.js';
6
+ import { RxDBChangeOrderByField, RxDBChangeRuleGroup, RxDBChangeStaticTypes } from './types.js';
3
7
  /**
4
8
  * 数据库变更记录
5
9
  *
6
10
  * 用于记录数据库中所有实体的更改历史
7
11
  * 主要用于数据变更追踪、审计日志和可能的数据回滚操作
8
12
  */
9
- export declare class RxDBChange {
13
+ export declare class RxDBChange implements IRxDBChange {
10
14
  static [ENTITY_STATIC_TYPES]: RxDBChangeStaticTypes;
11
15
  /**
12
16
  * id
13
17
  */
14
18
  id: number;
15
19
  /**
16
- * 变更类型
20
+ * 远程变更 ID
21
+ * 说明这个变更是远程同步过来的
17
22
  */
18
- type: 'INSERT' | 'UPDATE' | 'DELETE';
23
+ remoteId?: number | null;
19
24
  /**
20
- * 实体所属的命名空间
25
+ * 命名空间
21
26
  */
22
27
  namespace: string;
23
28
  /**
24
- * 发生变更的实体类型名称
29
+ * 实体名称
25
30
  */
26
31
  entity: string;
27
32
  /**
28
- * 发生变更的实体唯一标识符
33
+ * 实体 ID
29
34
  */
30
35
  entityId: UUID;
31
36
  /**
32
- * 反向补丁数据,用于撤销此次变更
33
- * 包含恢复到变更前状态所需的字段和值
37
+ * 分支 id
38
+ */
39
+ branchId?: string;
40
+ /**
41
+ * 事务 ID,用于关联同一事务中的多个变更
42
+ * 如果 undo/redo 操作涉及多个变更记录,可以通过相同的 transactionId 进行关联
43
+ */
44
+ transactionId?: UUID | null;
45
+ /**
46
+ * 变更类型
47
+ */
48
+ type: 'INSERT' | 'UPDATE' | 'DELETE';
49
+ /**
50
+ * 逆向补丁 - 用于回滚操作的旧值记录
51
+ *
52
+ * 记录操作前的数据状态,用于**撤销(undo)**操作
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * // 场景 1: 新增用户(INSERT)
57
+ * {
58
+ * type: 'INSERT',
59
+ * entityId: '123', // ID 记录在 entityId 中
60
+ * patch: { name: 'Alice', age: 25 }, // 新增的完整数据(不含 id)
61
+ * inversePatch: null // 新增前无数据,故为 null
62
+ * }
63
+ * // 撤销 INSERT:使用 inversePatch = null 表示需要执行 DELETE 操作
64
+ *
65
+ * // 场景 2: 更新用户(UPDATE)
66
+ * // 将用户名从 "Alice" 改为 "Bob",年龄从 25 改为 26
67
+ * {
68
+ * type: 'UPDATE',
69
+ * entityId: '123',
70
+ * patch: { name: 'Bob', age: 26 }, // 修改后的新值(仅包含变更字段,不含 id)
71
+ * inversePatch: { name: 'Alice', age: 25 } // 修改前的旧值(仅包含变更字段,不含 id)
72
+ * }
73
+ * // 撤销 UPDATE:使用 inversePatch 恢复到旧值
74
+ *
75
+ * // 场景 3: 删除用户(DELETE)
76
+ * {
77
+ * type: 'DELETE',
78
+ * entityId: '123',
79
+ * patch: null, // 删除后无数据,故为 null
80
+ * inversePatch: { name: 'Alice', age: 25, ... } // 删除前的完整数据(不含 id)
81
+ * }
82
+ * // 撤销 DELETE:使用 inversePatch 恢复完整记录(id 从 entityId 获取)
83
+ * ```
84
+ *
85
+ * @remarks
86
+ * **三种操作类型的 inversePatch 规则:**
87
+ * - **INSERT**: `inversePatch = null`(新增前无旧数据)
88
+ * - **UPDATE**: `inversePatch = { 变更字段的旧值 }`(仅记录变更字段,增量数据,**不含 id**)
89
+ * - **DELETE**: `inversePatch = { 完整的被删除数据 }`(除 id 外的所有字段,**不含 id**)
90
+ *
91
+ * **重要说明:**
92
+ * - ⚠️ `inversePatch` 和 `patch` **不包含 id 字段**,id 已记录在 `entityId` 中
93
+ * - 恢复数据时,使用 `entityId` 作为记录的 id
94
+ *
95
+ * **撤销操作逻辑:**
96
+ * - 撤销 INSERT → 执行 DELETE(使用 entityId)
97
+ * - 撤销 UPDATE → 执行 UPDATE(使用 entityId + inversePatch)
98
+ * - 撤销 DELETE → 执行 INSERT(使用 entityId + inversePatch)
34
99
  */
35
- inversePatch?: Record<string, any>;
100
+ inversePatch?: Record<string, any> | null;
36
101
  /**
37
- * 正向补丁数据,包含此次变更的具体内容
38
- * 记录了哪些字段被修改以及修改后的值
102
+ * 正向补丁 - 用于重放操作的新值记录
103
+ *
104
+ * 记录操作后的数据状态,用于**重做(redo)**操作
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * // 场景 1: 新增用户(INSERT)
109
+ * {
110
+ * type: 'INSERT',
111
+ * entityId: '123', // ID 记录在 entityId 中
112
+ * patch: { name: 'Alice', age: 25 }, // 新增的完整数据(不含 id)
113
+ * inversePatch: null
114
+ * }
115
+ * // 重做 INSERT:使用 entityId + patch 的完整数据执行 INSERT 操作
116
+ *
117
+ * // 场景 2: 更新用户(UPDATE)
118
+ * // 将用户名从 "Alice" 改为 "Bob",年龄从 25 改为 26
119
+ * {
120
+ * type: 'UPDATE',
121
+ * entityId: '123',
122
+ * patch: { name: 'Bob', age: 26 }, // 修改后的新值(仅包含变更字段,不含 id)
123
+ * inversePatch: { name: 'Alice', age: 25 }
124
+ * }
125
+ * // 重做 UPDATE:使用 entityId + patch 的增量数据执行 UPDATE 操作
126
+ *
127
+ * // 场景 3: 删除用户(DELETE)
128
+ * {
129
+ * type: 'DELETE',
130
+ * entityId: '123',
131
+ * patch: null, // 删除后无数据,故为 null
132
+ * inversePatch: { name: 'Alice', age: 25, ... }
133
+ * }
134
+ * // 重做 DELETE:使用 entityId 执行 DELETE 操作(patch 为 null)
135
+ * ```
136
+ *
137
+ * @remarks
138
+ * **三种操作类型的 patch 规则:**
139
+ * - **INSERT**: `patch = { 完整的新增数据 }`(除 id 外的所有字段,**不含 id**)
140
+ * - **UPDATE**: `patch = { 变更字段的新值 }`(仅记录变更字段,增量数据,**不含 id**)
141
+ * - **DELETE**: `patch = null`(删除后无数据)
142
+ *
143
+ * **重要说明:**
144
+ * - ⚠️ `patch` 和 `inversePatch` **不包含 id 字段**,id 已记录在 `entityId` 中
145
+ * - 执行操作时,使用 `entityId` 作为记录的 id
146
+ *
147
+ * **重做操作逻辑:**
148
+ * - 重做 INSERT → 执行 INSERT(使用 entityId + patch 的完整数据)
149
+ * - 重做 UPDATE → 执行 UPDATE(使用 entityId + patch 的增量数据)
150
+ * - 重做 DELETE → 执行 DELETE(使用 entityId)
151
+ *
152
+ * **与 inversePatch 的对称关系:**
153
+ * - INSERT: `patch = 完整数据(不含 id), inversePatch = null`
154
+ * - UPDATE: `patch = 新值增量(不含 id), inversePatch = 旧值增量(不含 id)`
155
+ * - DELETE: `patch = null, inversePatch = 完整数据(不含 id)`
39
156
  */
40
- patch?: Record<string, any>;
157
+ patch?: Record<string, any> | null;
41
158
  /**
42
- * 变更发生的时间戳
159
+ * 创建时间
160
+ * @default new Date()
43
161
  */
44
162
  createdAt: Date;
45
163
  /**
46
- * 变更更新
164
+ * updatedAt
165
+ * @default new Date()
47
166
  */
48
167
  updatedAt: Date;
49
168
  /**
50
- * 撤销此次变更的 id
51
- * 用于跟踪变更的回滚
169
+ * 撤销时间戳
170
+ *
171
+ * 记录此变更被撤销的时间,用于审计和追踪变更的完整生命周期
172
+ *
173
+ * @remarks
174
+ * **状态标记规则:**
175
+ * - `revertChangedAt = null`:变更从未被撤销,处于正常生效状态
176
+ * - `revertChangedAt != null` 且 `revertChangeId != null`:变更已撤销,当前未生效
177
+ * - `revertChangedAt != null` 且 `revertChangeId = null`:变更曾被撤销后又恢复(redo)
178
+ *
179
+ * **redo 操作的特殊处理:**
180
+ * - 执行 redo 时,只清除 `revertChangeId`(设为 null)
181
+ * - **保留** `revertChangedAt` 时间戳,用于记录曾被撤销的历史
182
+ * - 这样可以追踪完整的操作历史:创建 → 撤销(记录时间)→ 恢复(保留时间)
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * // 场景 1: 正常变更(从未撤销)
187
+ * {
188
+ * id: 1,
189
+ * type: 'INSERT',
190
+ * revertChangeId: null,
191
+ * revertChangedAt: null // 从未被撤销
192
+ * }
193
+ * ```
194
+ *
195
+ * @example
196
+ * ```ts
197
+ * // 场景 2: 已撤销的变更
198
+ * {
199
+ * id: 3,
200
+ * type: 'DELETE',
201
+ * revertChangeId: 4,
202
+ * revertChangedAt: new Date('2025-01-11T10:00:00Z') // 在此时间被撤销
203
+ * }
204
+ * // 查询条件:WHERE revertChangeId IS NOT NULL 可获取所有已撤销的变更
205
+ * ```
206
+ *
52
207
  * @example
53
- * 数据库有 3 条记录 1,2,3
54
- * 3 被还原,那么 3 的 revertChangeId 就是 4
55
- * 如何这个时候有条新记录,那么数据库共有4条记录,分别是 1,2,3,5
208
+ * ```ts
209
+ * // 场景 3: 撤销后又恢复的变更(完整生命周期)
210
+ * // 初始创建:
211
+ * { id: 5, type: 'UPDATE', createdAt: '2025-01-11T09:00:00Z', revertChangedAt: null }
212
+ *
213
+ * // 用户执行 undo(撤销):
214
+ * {
215
+ * id: 5,
216
+ * revertChangeId: 6,
217
+ * revertChangedAt: new Date('2025-01-11T10:00:00Z') // 记录撤销时间
218
+ * }
219
+ *
220
+ * // 用户执行 redo(恢复):
221
+ * {
222
+ * id: 5,
223
+ * revertChangeId: null, // ✅ 清除,表示已恢复生效
224
+ * revertChangedAt: new Date('2025-01-11T10:00:00Z') // ⚠️ 保留,审计痕迹
225
+ * }
226
+ *
227
+ * // 通过此记录可以得知:
228
+ * // - 09:00:00 创建
229
+ * // - 10:00:00 被撤销
230
+ * // - (稍后某时)被恢复
231
+ * // - revertChangedAt 永久保留撤销时间,便于审计分析
232
+ * ```
233
+ *
234
+ * @example
235
+ * ```ts
236
+ * // 场景 4: 审计查询示例
237
+ * // 查询所有当前已撤销的变更:
238
+ * // SELECT * FROM RxDBChange WHERE revertChangeId IS NOT NULL
239
+ *
240
+ * // 查询所有曾被撤销过的变更(包括已恢复的):
241
+ * // SELECT * FROM RxDBChange WHERE revertChangedAt IS NOT NULL
242
+ *
243
+ * // 查询曾被撤销但已恢复的变更:
244
+ * // SELECT * FROM RxDBChange
245
+ * // WHERE revertChangedAt IS NOT NULL AND revertChangeId IS NULL
246
+ *
247
+ * // 查询在特定时间段内被撤销的变更:
248
+ * // SELECT * FROM RxDBChange
249
+ * // WHERE revertChangedAt BETWEEN '2025-01-11T09:00:00Z' AND '2025-01-11T11:00:00Z'
250
+ * ```
251
+ *
252
+ * @see {@link revertChangeId} - 撤销标记 ID,配合此时间戳判断撤销状态
56
253
  */
57
- revertChangeId?: number;
254
+ revertChangedAt?: Date | null;
58
255
  /**
59
- * 撤销此次变更的时间
256
+ * 撤销此次变更的 ID
257
+ *
258
+ * 用于标记此变更已被撤销,并预留序列号空位以保持变更历史的连续性和可追溯性
259
+ *
260
+ * @remarks
261
+ * **核心机制:**
262
+ * - 当执行 undo 操作时,**不会创建新的变更记录**
263
+ * - 而是在被撤销的变更上标记 `revertChangeId` 和 `revertChangedAt`
264
+ * - `revertChangeId` 指向 **下一个应该分配的 ID**(等于当前序列值 + 1)
265
+ * - 系统会**递增序列值**,为 revertChangeId 预留位置(但不实际创建记录)
266
+ * - 这样可以在变更历史中留下"撤销痕迹",便于审计和时间线重建
267
+ *
268
+ * **ID 分配规则:**
269
+ * - 正常变更:使用序列的下一个值(如 1, 2, 3...)
270
+ * - 撤销变更:在原记录标记 revertChangeId,序列跳过一个号(预留空位)
271
+ * - 后续新变更:从跳过后的序列值继续(如 5, 6, 7...)
272
+ *
273
+ * @example
274
+ * ```ts
275
+ * // 场景 1: 基础撤销流程
276
+ * // 初始状态:数据库有 3 条变更记录
277
+ * [
278
+ * { id: 1, type: 'INSERT', entity: 'User', revertChangeId: null },
279
+ * { id: 2, type: 'UPDATE', entity: 'User', revertChangeId: null },
280
+ * { id: 3, type: 'DELETE', entity: 'User', revertChangeId: null }
281
+ * ]
282
+ * // 当前序列值:3
283
+ *
284
+ * // 用户执行 undo,撤销记录 3
285
+ * // 1. 查询当前序列值:3
286
+ * // 2. 计算 revertChangeId = 3 + 1 = 4
287
+ * // 3. 更新记录 3
288
+ * { id: 3, revertChangeId: 4, revertChangedAt: new Date('2025-01-11T10:00:00Z') }
289
+ * // 4. 递增序列值到 4(预留 ID 4,但不创建实际记录)
290
+ *
291
+ * // 用户添加新的变更(如插入新用户)
292
+ * // 5. 新记录使用序列值 5(跳过了 4)
293
+ * { id: 5, type: 'INSERT', entity: 'User', revertChangeId: null }
294
+ *
295
+ * // 最终数据库记录:
296
+ * [
297
+ * { id: 1, ... },
298
+ * { id: 2, ... },
299
+ * { id: 3, ..., revertChangeId: 4, revertChangedAt: '2025-01-11T10:00:00Z' }, // 已撤销
300
+ * // ID 4 空缺(被预留为撤销标记)
301
+ * { id: 5, ... } // 新变更
302
+ * ]
303
+ * ```
304
+ *
305
+ * @example
306
+ * ```ts
307
+ * // 场景 2: 连续撤销多个变更
308
+ * // 初始状态:5 条变更记录
309
+ * [
310
+ * { id: 1, ... },
311
+ * { id: 2, ... },
312
+ * { id: 3, ... },
313
+ * { id: 4, ... },
314
+ * { id: 5, ... }
315
+ * ]
316
+ *
317
+ * // 用户连续 undo:撤销记录 5、4、3
318
+ * // Step 1: 撤销记录 5
319
+ * { id: 5, revertChangeId: 6, revertChangedAt: '2025-01-11T10:00:00Z' }
320
+ * // 序列值:6
321
+ *
322
+ * // Step 2: 撤销记录 4
323
+ * { id: 4, revertChangeId: 7, revertChangedAt: '2025-01-11T10:01:00Z' }
324
+ * // 序列值:7
325
+ *
326
+ * // Step 3: 撤销记录 3
327
+ * { id: 3, revertChangeId: 8, revertChangedAt: '2025-01-11T10:02:00Z' }
328
+ * // 序列值:8
329
+ *
330
+ * // 用户添加新变更
331
+ * { id: 9, type: 'INSERT', ... }
332
+ *
333
+ * // 最终记录:
334
+ * [
335
+ * { id: 1, ... },
336
+ * { id: 2, ... },
337
+ * { id: 3, ..., revertChangeId: 8 }, // 已撤销
338
+ * { id: 4, ..., revertChangeId: 7 }, // 已撤销
339
+ * { id: 5, ..., revertChangeId: 6 }, // 已撤销
340
+ * // ID 6, 7, 8 空缺(预留位)
341
+ * { id: 9, ... } // 新变更
342
+ * ]
343
+ * ```
344
+ *
345
+ * @example
346
+ * ```ts
347
+ * // 场景 3: 撤销后再重做(redo)
348
+ * // 初始状态:记录 3 已被撤销
349
+ * [
350
+ * { id: 1, type: 'INSERT', revertChangeId: null, revertChangedAt: null },
351
+ * { id: 2, type: 'UPDATE', revertChangeId: null, revertChangedAt: null },
352
+ * { id: 3, type: 'DELETE', revertChangeId: 4, revertChangedAt: '2025-01-11T10:00:00Z' }
353
+ * ]
354
+ * // 序列值:4
355
+ *
356
+ * // 用户执行 redo,恢复记录 3 的操作
357
+ * // 1. 根据 patch 重新执行操作(此处为 DELETE)
358
+ * // 2. 更新记录 3 的撤销状态:
359
+ * {
360
+ * id: 3,
361
+ * type: 'DELETE',
362
+ * revertChangeId: null, // ✅ 清除撤销标记,表示已恢复
363
+ * revertChangedAt: '2025-01-11T10:00:00Z' // ⚠️ 保留时间戳,记录曾被撤销的历史
364
+ * }
365
+ *
366
+ * // 最终状态:
367
+ * [
368
+ * { id: 1, revertChangeId: null, revertChangedAt: null },
369
+ * { id: 2, revertChangeId: null, revertChangedAt: null },
370
+ * { id: 3, revertChangeId: null, revertChangedAt: '2025-01-11T10:00:00Z' } // 已恢复,但保留历史
371
+ * // ID 4 仍然空缺(曾预留的撤销标记位)
372
+ * ]
373
+ *
374
+ * // **关键要点:**
375
+ * // - revertChangeId = null:表示当前变更处于"生效"状态
376
+ * // - revertChangedAt 非 null:表示此变更曾被撤销过(审计痕迹)
377
+ * // - 通过 revertChangedAt 可以追踪变更的完整生命周期:创建 → 撤销 → 恢复
378
+ * ```
379
+ *
380
+ * @example
381
+ * ```ts
382
+ * // 场景 4: 事务中的批量撤销
383
+ * // 一个事务创建了 3 个变更:
384
+ * const txId = 'a1b2c3d4-...';
385
+ * [
386
+ * { id: 10, type: 'INSERT', transactionId: txId, ... },
387
+ * { id: 11, type: 'UPDATE', transactionId: txId, ... },
388
+ * { id: 12, type: 'INSERT', transactionId: txId, ... }
389
+ * ]
390
+ *
391
+ * // 用户撤销整个事务
392
+ * // 按逆序撤销(12 → 11 → 10):
393
+ * { id: 12, revertChangeId: 13, revertChangedAt: '...' }
394
+ * { id: 11, revertChangeId: 14, revertChangedAt: '...' }
395
+ * { id: 10, revertChangeId: 15, revertChangedAt: '...' }
396
+ *
397
+ * // 下一个变更 ID 将是 16(跳过了 13, 14, 15)
398
+ * ```
399
+ *
400
+ * @see {@link revertChangedAt} - 撤销操作的时间戳
401
+ * @see {@link transactionId} - 事务 ID,用于批量撤销
60
402
  */
61
- revertChangedAt?: Date | null;
403
+ revertChangeId?: number | null;
62
404
  /**
63
- * 变更所属的事务
405
+ * Redo 废弃时间戳
406
+ *
407
+ * 当用户在执行 undo 后创建新操作时,所有可 redo 的变更将被标记为"已废弃"
408
+ * 废弃后的变更不再出现在 redo 栈中,但仍保留在数据库中用于审计
409
+ *
410
+ * @remarks
411
+ * **核心机制:**
412
+ * - 用户操作:创建 A → 创建 B → undo(B) → 创建 C
413
+ * - 此时 B 的 `redoInvalidatedAt` 被设置为 C 的创建时间
414
+ * - B 不再能被 redo,符合标准 undo/redo 栈行为
415
+ *
416
+ * **状态判断规则:**
417
+ * ```
418
+ * revertChangeId | redoInvalidatedAt | 状态说明
419
+ * ----------------|-------------------|---------------------------
420
+ * null | null | 正常生效中
421
+ * 123 | null | 已撤销,可 redo
422
+ * 123 | 2025-01-11T10:00 | 已撤销且已废弃,不可 redo
423
+ * null | 2025-01-11T10:00 | (不应出现此状态)
424
+ * ```
425
+ *
426
+ * **与 revertChangeId/revertChangedAt 的关系:**
427
+ * - `revertChangeId != null` → 已被撤销
428
+ * - `redoInvalidatedAt != null` → redo 机会已失效
429
+ * - 两者独立:撤销是用户主动操作,废弃是新操作触发的副作用
430
+ *
431
+ * @example
432
+ * ```ts
433
+ * // 场景 1: 标准 undo/redo 栈行为
434
+ * // Step 1: 用户创建 3 条数据
435
+ * const changes = [
436
+ * { id: 1, type: 'INSERT', entity: 'A', revertChangeId: null, redoInvalidatedAt: null },
437
+ * { id: 2, type: 'INSERT', entity: 'B', revertChangeId: null, redoInvalidatedAt: null },
438
+ * { id: 3, type: 'INSERT', entity: 'C', revertChangeId: null, redoInvalidatedAt: null }
439
+ * ];
440
+ *
441
+ * // Step 2: 用户撤销 C
442
+ * await undoDatabase(1);
443
+ * // 结果:
444
+ * { id: 3, revertChangeId: 4, revertChangedAt: '2025-01-11T10:00:00', redoInvalidatedAt: null }
445
+ * // 此时 redo 栈包含 C
446
+ *
447
+ * // Step 3: 用户创建新数据 D
448
+ * const newChange = { id: 5, type: 'INSERT', entity: 'D' };
449
+ * await newChange.save();
450
+ *
451
+ * // Step 4: 系统自动标记 C 为废弃
452
+ * {
453
+ * id: 3,
454
+ * revertChangeId: 4,
455
+ * revertChangedAt: '2025-01-11T10:00:00',
456
+ * redoInvalidatedAt: '2025-01-11T10:05:00' // ✅ 新数据创建时间
457
+ * }
458
+ * // 此时 redo 栈为空,C 无法被 redo
459
+ * ```
460
+ *
461
+ * @example
462
+ * ```ts
463
+ * // 场景 2: 多次 undo 后创建新数据
464
+ * // Step 1: 初始状态
465
+ * [
466
+ * { id: 1, entity: 'A', revertChangeId: null },
467
+ * { id: 2, entity: 'B', revertChangeId: null },
468
+ * { id: 3, entity: 'C', revertChangeId: null },
469
+ * { id: 4, entity: 'D', revertChangeId: null }
470
+ * ];
471
+ *
472
+ * // Step 2: 用户连续撤销 2 次(D 和 C)
473
+ * await undoDatabase(2);
474
+ * // 结果:
475
+ * { id: 4, revertChangeId: 5, revertChangedAt: '10:00:00', redoInvalidatedAt: null }
476
+ * { id: 3, revertChangeId: 6, revertChangedAt: '10:00:01', redoInvalidatedAt: null }
477
+ * // redo 栈:[D, C](按撤销时间倒序)
478
+ *
479
+ * // Step 3: 用户创建新数据 E
480
+ * const e = { id: 7, type: 'INSERT', entity: 'E' };
481
+ * await e.save();
482
+ *
483
+ * // Step 4: 系统批量废弃所有可 redo 的变更
484
+ * {
485
+ * id: 4,
486
+ * revertChangeId: 5,
487
+ * redoInvalidatedAt: '2025-01-11T10:10:00' // ✅ E 的创建时间
488
+ * }
489
+ * {
490
+ * id: 3,
491
+ * revertChangeId: 6,
492
+ * redoInvalidatedAt: '2025-01-11T10:10:00' // ✅ E 的创建时间
493
+ * }
494
+ * // redo 栈清空,D 和 C 都无法 redo
495
+ * ```
496
+ *
497
+ * @example
498
+ * ```ts
499
+ * // 场景 3: undo/redo/新操作的完整流程
500
+ * // Step 1-3: (同场景 1)
501
+ * // Step 4: 用户意识到不想创建 D,先 undo 掉 D
502
+ * await undoDatabase(1);
503
+ * { id: 5, revertChangeId: 8, revertChangedAt: '10:06:00', redoInvalidatedAt: null }
504
+ *
505
+ * // Step 5: 用户尝试 redo C(失败,因为已废弃)
506
+ * await redoDatabase(1);
507
+ * // redoHistories$ 过滤掉了 C (redoInvalidatedAt != null)
508
+ * // 只能 redo D
509
+ *
510
+ * // 当前状态:
511
+ * { id: 3, revertChangeId: 4, redoInvalidatedAt: '10:05:00' } // C 已废弃
512
+ * { id: 5, revertChangeId: 8, redoInvalidatedAt: null } // D 可 redo
513
+ * ```
514
+ *
515
+ * @example
516
+ * ```ts
517
+ * // 场景 4: 查询示例
518
+ * // 查询所有可 redo 的变更(未废弃):
519
+ * RxDBChange.findAll({
520
+ * where: {
521
+ * combinator: 'and',
522
+ * rules: [
523
+ * { field: 'revertChangeId', operator: '!=', value: null },
524
+ * { field: 'redoInvalidatedAt', operator: '=', value: null }
525
+ * ]
526
+ * }
527
+ * });
528
+ *
529
+ * // 查询所有已废弃的 redo 机会(审计用途):
530
+ * RxDBChange.findAll({
531
+ * where: {
532
+ * combinator: 'and',
533
+ * rules: [
534
+ * { field: 'redoInvalidatedAt', operator: '!=', value: null }
535
+ * ]
536
+ * }
537
+ * });
538
+ * ```
539
+ *
540
+ * @see {@link revertChangeId} - 撤销标记,配合判断是否可 redo
541
+ * @see {@link revertChangedAt} - 撤销时间戳
64
542
  */
65
- transactionId?: UUID;
543
+ redoInvalidatedAt?: Date | null;
66
544
  /**
67
- * 变更所属的分支
545
+ * branch
546
+ */
547
+ branch$: RelationEntityObservable<typeof RxDBBranch>;
548
+ /**
549
+ * count 查询
550
+ * @param options 查询选项
551
+ * @example
552
+ * ```ts
553
+ * // 统计所有变更记录数量
554
+ * RxDBChange.count({
555
+ * where: {
556
+ * combinator: 'and',
557
+ * rules: []
558
+ * }
559
+ * }).subscribe(total => console.log(total));
560
+ *
561
+ * // 统计特定实体的变更数量
562
+ * RxDBChange.count({
563
+ * where: {
564
+ * combinator: 'and',
565
+ * rules: [{ field: 'entity', operator: '=', value: 'User' }]
566
+ * }
567
+ * }).subscribe(count => console.log(count));
568
+ * ```
68
569
  */
69
- branchId: string | null;
570
+ static count: (options: CountOptions<typeof RxDBChange, RxDBChangeRuleGroup>) => Observable<number>;
70
571
  /**
71
- * 变更父级
572
+ * find 查询
573
+ * @param options 查询选项
574
+ * @example
575
+ * ```ts
576
+ * // 查询所有变更记录
577
+ * RxDBChange.find({
578
+ * where: {
579
+ * combinator: 'and',
580
+ * rules: []
581
+ * }
582
+ * }).subscribe(changes => console.log(changes));
583
+ * ```
584
+ *
585
+ */
586
+ static find: (options: FindOptions<typeof RxDBChange, RxDBChangeRuleGroup, RxDBChangeOrderByField>) => Observable<RxDBChange[]>;
587
+ /**
588
+ * findAll 查询
589
+ * @param options 查询选项
590
+ * @example
591
+ * ```ts
592
+ * // 查询所有变更记录(按 ID 排序)
593
+ * RxDBChange.findAll({
594
+ * where: {
595
+ * combinator: 'and',
596
+ * rules: []
597
+ * },
598
+ * orderBy: { id: 'ASC' }
599
+ * }).subscribe(changes => console.log(changes));
600
+ * ```
601
+ */
602
+ static findAll: (options: FindAllOptions<typeof RxDBChange, RxDBChangeRuleGroup, RxDBChangeOrderByField>) => Observable<RxDBChange[]>;
603
+ /**
604
+ * findByCursor 查询
605
+ * @param options 查询选项
606
+ */
607
+ static findByCursor: (options: FindByCursorOptions<typeof RxDBChange, RxDBChangeRuleGroup, RxDBChangeOrderByField>) => Observable<RxDBChange[]>;
608
+ /**
609
+ * findOne 查询
610
+ * @param options 查询选项
611
+ * @example
612
+ * ```ts
613
+ * // 查询最新的变更记录
614
+ * RxDBChange.findOne({
615
+ * where: {
616
+ * combinator: 'and',
617
+ * rules: []
618
+ * },
619
+ * orderBy: { id: 'DESC' }
620
+ * }).subscribe(change => console.log(change));
621
+ * ```
622
+ */
623
+ static findOne: (options: FindOneOptions<typeof RxDBChange, RxDBChangeRuleGroup, RxDBChangeOrderByField>) => Observable<RxDBChange | undefined>;
624
+ /**
625
+ * findOneOrFail 查询
626
+ * @param options 查询选项
627
+ * @example
628
+ * ```ts
629
+ * // 查询指定 ID 的变更(不存在则抛出错误)
630
+ * RxDBChange.findOneOrFail({
631
+ * where: {
632
+ * combinator: 'and',
633
+ * rules: [{ field: 'id', operator: '=', value: 123 }]
634
+ * }
635
+ * }).subscribe(change => console.log(change));
636
+ * ```
637
+ */
638
+ static findOneOrFail: (options: FindOneOrFailOptions<typeof RxDBChange, RxDBChangeRuleGroup, RxDBChangeOrderByField>) => Observable<RxDBChange>;
639
+ /**
640
+ * get 查询
641
+ * @param options 查询选项
642
+ * @example
643
+ * ```ts
644
+ * // 根据主键 ID 获取变更记录
645
+ * RxDBChange.get(123).subscribe(change => console.log(change));
646
+ * ```
72
647
  */
73
- parentId?: number | null;
648
+ static get: (options: number) => Observable<RxDBChange>;
74
649
  }
75
650
  //# sourceMappingURL=change.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/system/change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;GAKG;AACH,qBA4Fa,UAAU;IACrB,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,qBAAqB,CAAC;IAEpD;;OAEG;IACH,EAAE,EAAG,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEtC;;OAEG;IACH,SAAS,EAAG,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAG,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAG,IAAI,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE5B;;OAEG;IACH,SAAS,EAAG,IAAI,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAG,IAAI,CAAC;IAEjB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;IAErB;;OAEG;IACH,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/system/change.ts"],"names":[],"mappings":"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"}