@aiao/rxdb 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/README.md +1 -0
- package/RxDB.d.ts +51 -0
- package/RxDBError.d.ts +13 -0
- package/entity/@Entity.d.ts +29 -0
- package/entity/@TreeEntity.d.ts +50 -0
- package/entity/EntityBase.d.ts +49 -0
- package/entity/EntityManager.d.ts +140 -0
- package/entity/EntityStatus.d.ts +211 -0
- package/entity/TreeEntityBase.d.ts +7 -0
- package/entity/entity-metadata-options.interface.d.ts +434 -0
- package/entity/entity-metadata.interface.d.ts +67 -0
- package/entity/entity.interface.d.ts +110 -0
- package/entity/entity.utils.d.ts +59 -0
- package/entity/entity_proxy_helper.d.ts +48 -0
- package/entity/entity_relation_helper.d.ts +15 -0
- package/entity/generate_many_to_many_entity.d.ts +35 -0
- package/entity/transition-metadata.d.ts +17 -0
- package/index.d.ts +26 -0
- package/index.js +1783 -0
- package/package.json +19 -0
- package/repository/Repository.d.ts +108 -0
- package/repository/RepositoryBase.d.ts +32 -0
- package/repository/TreeRepository.d.ts +28 -0
- package/repository/query-options.interface.d.ts +53 -0
- package/repository/query.interface.d.ts +92 -0
- package/repository/query.utils.d.ts +19 -0
- package/repository/repository.interface.d.ts +84 -0
- package/repository/tree-query-options.interface.d.ts +9 -0
- package/repository/tree-repository.interface.d.ts +26 -0
- package/rxdb-adapter.d.ts +73 -0
- package/rxdb-events.d.ts +186 -0
- package/rxdb-plugin.d.ts +20 -0
- package/rxdb-utils.d.ts +20 -0
- package/rxdb.interface.d.ts +56 -0
- package/rxdb.private.d.ts +55 -0
- package/schema/SchemaManager.d.ts +57 -0
- package/system/change.d.ts +13 -0
- package/system/migration.d.ts +9 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { SetRequired } from 'type-fest';
|
|
2
|
+
import { EntityType } from './entity.interface';
|
|
3
|
+
/**
|
|
4
|
+
* 实体字段基础值对象接口
|
|
5
|
+
* 定义实体属性的基本特性
|
|
6
|
+
*/
|
|
7
|
+
interface IEntityObject {
|
|
8
|
+
/**
|
|
9
|
+
* 名字
|
|
10
|
+
* 非大写开头的英文单词,只能包含英文单词和下划线
|
|
11
|
+
*/
|
|
12
|
+
name: Uncapitalize<string>;
|
|
13
|
+
/**
|
|
14
|
+
* 显示名称
|
|
15
|
+
* @example "用户", "订单项"
|
|
16
|
+
*/
|
|
17
|
+
displayName?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 是否唯一
|
|
20
|
+
* 如果为 true 那么这个数据得值不允许重复
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
unique?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 是否为只读
|
|
26
|
+
* 如果为 true 那么这个数据只有创建的时候写一次,在更新数据时,这个列的值不会被更新
|
|
27
|
+
* 如果为 false 那么在更新数据时,这个列的值会被更新
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
readonly?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* 是否可以为 NULL
|
|
33
|
+
* @default false
|
|
34
|
+
*/
|
|
35
|
+
nullable?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 实体排序接口
|
|
39
|
+
* 定义实体属性的排序能力
|
|
40
|
+
*/
|
|
41
|
+
interface ISortable {
|
|
42
|
+
/**
|
|
43
|
+
* 是否可排序
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
sortable?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 实体属性类型枚举
|
|
50
|
+
* 定义实体属性支持的数据类型
|
|
51
|
+
*/
|
|
52
|
+
export declare enum PropertyType {
|
|
53
|
+
/**
|
|
54
|
+
* uuid
|
|
55
|
+
*/
|
|
56
|
+
uuid = "uuid",
|
|
57
|
+
/**
|
|
58
|
+
* 字符串
|
|
59
|
+
*/
|
|
60
|
+
string = "string",
|
|
61
|
+
/**
|
|
62
|
+
* 数字
|
|
63
|
+
*/
|
|
64
|
+
number = "number",
|
|
65
|
+
/**
|
|
66
|
+
* 整数
|
|
67
|
+
*/
|
|
68
|
+
integer = "integer",
|
|
69
|
+
/**
|
|
70
|
+
* 布尔
|
|
71
|
+
*/
|
|
72
|
+
boolean = "boolean",
|
|
73
|
+
/**
|
|
74
|
+
* 日期
|
|
75
|
+
*/
|
|
76
|
+
date = "date",
|
|
77
|
+
/**
|
|
78
|
+
* json
|
|
79
|
+
*/
|
|
80
|
+
json = "json"
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 实体关系类型枚举
|
|
84
|
+
* 定义实体之间可能的关系类型
|
|
85
|
+
*
|
|
86
|
+
* 支持四种标准的实体关系类型:
|
|
87
|
+
* - 一对一:一个实体只关联另一个实体的一个实例
|
|
88
|
+
* - 一对多:一个实体关联另一个实体的多个实例
|
|
89
|
+
* - 多对一:多个实体关联另一个实体的一个实例
|
|
90
|
+
* - 多对多:多个实体关联另一个实体的多个实例,通常需要中间表
|
|
91
|
+
*/
|
|
92
|
+
export declare enum RelationKind {
|
|
93
|
+
ONE_TO_ONE = "1:1",
|
|
94
|
+
ONE_TO_MANY = "1:m",
|
|
95
|
+
MANY_TO_ONE = "m:1",
|
|
96
|
+
MANY_TO_MANY = "m:n"
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 标量类型
|
|
100
|
+
* 定义可以直接存储的基本数据类型
|
|
101
|
+
*/
|
|
102
|
+
export type RxDBScalar = boolean | number | string | bigint | Date | Uint8Array;
|
|
103
|
+
/**
|
|
104
|
+
* 实体关系基础类型接口
|
|
105
|
+
* 所有关系类型的基础接口
|
|
106
|
+
*/
|
|
107
|
+
interface EntityRelationMetadataBase extends ISortable {
|
|
108
|
+
/**
|
|
109
|
+
* 名字
|
|
110
|
+
*/
|
|
111
|
+
name: Uncapitalize<string>;
|
|
112
|
+
/**
|
|
113
|
+
* 显示名称
|
|
114
|
+
* @example "用户", "订单项"
|
|
115
|
+
*/
|
|
116
|
+
displayName?: string;
|
|
117
|
+
/**
|
|
118
|
+
* 类型
|
|
119
|
+
*/
|
|
120
|
+
kind: RelationKind;
|
|
121
|
+
/**
|
|
122
|
+
* 关联的实体
|
|
123
|
+
* @default "public"
|
|
124
|
+
*/
|
|
125
|
+
mappedNamespace?: Lowercase<string>;
|
|
126
|
+
/**
|
|
127
|
+
* 关联的实体
|
|
128
|
+
*/
|
|
129
|
+
mappedEntity: Capitalize<string>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 一对一关系元数据接口
|
|
133
|
+
* 定义两个实体之间的一对一关系
|
|
134
|
+
*/
|
|
135
|
+
interface EntityRelationOneToOneMetadataOptions extends EntityRelationMetadataBase, IEntityObject {
|
|
136
|
+
kind: RelationKind.ONE_TO_ONE;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 一对多关系元数据接口
|
|
140
|
+
* 定义一个实体与多个实体之间的关系
|
|
141
|
+
*/
|
|
142
|
+
interface EntityRelationOneToManyMetadataOptions extends EntityRelationMetadataBase {
|
|
143
|
+
kind: RelationKind.ONE_TO_MANY;
|
|
144
|
+
/**
|
|
145
|
+
* 关联实体的属性名
|
|
146
|
+
*/
|
|
147
|
+
mappedProperty: Uncapitalize<string>;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 多对一关系元数据接口
|
|
151
|
+
* 定义多个实体与一个实体之间的关系
|
|
152
|
+
*/
|
|
153
|
+
interface EntityRelationManyToOneMetadataOptions extends EntityRelationMetadataBase, IEntityObject {
|
|
154
|
+
kind: RelationKind.MANY_TO_ONE;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 多对多关系元数据接口
|
|
158
|
+
* 定义多个实体与多个实体之间的关系,通常需要中间表(连接表)
|
|
159
|
+
*
|
|
160
|
+
* 多对多关系允许一个实体的多个实例关联到另一个实体的多个实例。
|
|
161
|
+
* 例如:学生和课程的关系,一个学生可以选多门课程,一门课程可以有多个学生。
|
|
162
|
+
* 这种关系需要一个中间表来存储两个实体之间的关联关系。
|
|
163
|
+
*/
|
|
164
|
+
interface EntityRelationManyToManyMetadataOptions extends EntityRelationMetadataBase {
|
|
165
|
+
kind: RelationKind.MANY_TO_MANY;
|
|
166
|
+
/**
|
|
167
|
+
* 关联实体的属性名
|
|
168
|
+
*/
|
|
169
|
+
mappedProperty: Uncapitalize<string>;
|
|
170
|
+
/**
|
|
171
|
+
* 中间表(连接表)的实体类型
|
|
172
|
+
* 用于存储多对多关系中两个实体之间的关联
|
|
173
|
+
* 中间表通常包含两个外键,分别指向关联的两个实体
|
|
174
|
+
*/
|
|
175
|
+
junctionEntityType?: EntityType;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 实体关系元数据联合类型
|
|
179
|
+
* 包含所有可能的关系类型(一对一、一对多、多对一、多对多)
|
|
180
|
+
*
|
|
181
|
+
* 在定义实体时,可以使用这些关系类型来配置实体之间的关联
|
|
182
|
+
* 系统会根据关系类型自动处理外键、查询和关联操作
|
|
183
|
+
*/
|
|
184
|
+
export type EntityRelationMetadataOptions = EntityRelationOneToOneMetadataOptions | EntityRelationOneToManyMetadataOptions | EntityRelationManyToOneMetadataOptions | EntityRelationManyToManyMetadataOptions;
|
|
185
|
+
export type EntityRelationOneToOneMetadata = SetRequired<EntityRelationOneToOneMetadataOptions, 'mappedNamespace'>;
|
|
186
|
+
export type EntityRelationOneToManyMetadata = SetRequired<EntityRelationOneToManyMetadataOptions, 'mappedNamespace'>;
|
|
187
|
+
export type EntityRelationManyToOneMetadata = SetRequired<EntityRelationManyToOneMetadataOptions, 'mappedNamespace'>;
|
|
188
|
+
export type EntityRelationManyToManyMetadata = SetRequired<EntityRelationManyToManyMetadataOptions, 'mappedNamespace' | 'junctionEntityType'>;
|
|
189
|
+
export type EntityRelationMetadata = EntityRelationOneToOneMetadata | EntityRelationOneToManyMetadata | EntityRelationManyToOneMetadata | EntityRelationManyToManyMetadata;
|
|
190
|
+
/**
|
|
191
|
+
* 默认非主键属性元数据接口
|
|
192
|
+
* 定义普通实体属性的元数据
|
|
193
|
+
*/
|
|
194
|
+
interface EntityPropertyDefaultMetadataOptions extends IEntityObject, ISortable {
|
|
195
|
+
primary?: false;
|
|
196
|
+
/**
|
|
197
|
+
* 类型
|
|
198
|
+
*/
|
|
199
|
+
type: PropertyType;
|
|
200
|
+
/**
|
|
201
|
+
* 默认值
|
|
202
|
+
* 创建数据时如果没有数据就用 default
|
|
203
|
+
*/
|
|
204
|
+
default?: RxDBScalar | (() => RxDBScalar);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 整数主键属性元数据接口
|
|
208
|
+
* 定义使用整数类型作为主键的属性元数据
|
|
209
|
+
*/
|
|
210
|
+
interface EntityPrimaryIntegerPropertyMetadataOptions extends IEntityObject, ISortable {
|
|
211
|
+
/**
|
|
212
|
+
* 是否主键
|
|
213
|
+
*/
|
|
214
|
+
primary: true;
|
|
215
|
+
/**
|
|
216
|
+
* 类型
|
|
217
|
+
*/
|
|
218
|
+
type: PropertyType.integer;
|
|
219
|
+
/**
|
|
220
|
+
* 默认值
|
|
221
|
+
* 创建数据时如果没有数据就用 default
|
|
222
|
+
*/
|
|
223
|
+
default?: RxDBScalar | (() => RxDBScalar);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* UUID主键属性元数据接口
|
|
227
|
+
* 定义使用UUID类型作为主键的属性元数据
|
|
228
|
+
*/
|
|
229
|
+
interface EntityPrimaryUUIDPropertyMetadataOptions extends IEntityObject, ISortable {
|
|
230
|
+
/**
|
|
231
|
+
* 是否主键
|
|
232
|
+
*/
|
|
233
|
+
primary: true;
|
|
234
|
+
/**
|
|
235
|
+
* 类型
|
|
236
|
+
*/
|
|
237
|
+
type: PropertyType.uuid;
|
|
238
|
+
/**
|
|
239
|
+
* 默认值
|
|
240
|
+
* 创建数据时如果没有数据就用 default
|
|
241
|
+
*/
|
|
242
|
+
default?: RxDBScalar | (() => RxDBScalar);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* 日期属性元数据接口
|
|
246
|
+
* 定义日期类型属性的特殊元数据
|
|
247
|
+
*/
|
|
248
|
+
interface EntityDatePropertyMetadataOptions extends EntityPropertyDefaultMetadataOptions {
|
|
249
|
+
/**
|
|
250
|
+
* 类型
|
|
251
|
+
*/
|
|
252
|
+
type: PropertyType.date;
|
|
253
|
+
/**
|
|
254
|
+
* 默认值
|
|
255
|
+
* 创建数据时如果没有数据就用 default
|
|
256
|
+
* CURRENT_TIMESTAMP 默认当前时间
|
|
257
|
+
*/
|
|
258
|
+
default?: RxDBScalar | (() => RxDBScalar) | 'CURRENT_TIMESTAMP';
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* 实体属性元数据联合类型
|
|
262
|
+
* 包含所有可能的属性类型元数据
|
|
263
|
+
*/
|
|
264
|
+
export type EntityPropertyMetadataOptions = EntityPrimaryIntegerPropertyMetadataOptions | EntityPrimaryUUIDPropertyMetadataOptions | EntityPropertyDefaultMetadataOptions | EntityDatePropertyMetadataOptions;
|
|
265
|
+
export type EntityPropertyMetadata = EntityPropertyMetadataOptions;
|
|
266
|
+
/**
|
|
267
|
+
* 实体索引元数据接口
|
|
268
|
+
* 定义实体索引的配置
|
|
269
|
+
*/
|
|
270
|
+
export interface EntityIndexMetadataOptions extends IEntityObject {
|
|
271
|
+
properties?: string[];
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* 实体定义元数据选项接口
|
|
275
|
+
* 用于配置 @Entity 装饰器的完整选项,定义实体的结构和行为
|
|
276
|
+
*
|
|
277
|
+
* 这个接口是实体定义的核心,包含了实体的所有配置信息:
|
|
278
|
+
* - 基本信息:名称、命名空间、显示名称
|
|
279
|
+
* - 结构信息:属性、关系、索引
|
|
280
|
+
* - 行为信息:抽象类标记、日志配置、同步策略
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```typescript
|
|
284
|
+
* @Entity({
|
|
285
|
+
* name: 'User',
|
|
286
|
+
* displayName: '用户',
|
|
287
|
+
* properties: [
|
|
288
|
+
* { name: 'name', type: PropertyType.string, displayName: '姓名' },
|
|
289
|
+
* { name: 'age', type: PropertyType.number, displayName: '年龄' }
|
|
290
|
+
* ],
|
|
291
|
+
* relations: [
|
|
292
|
+
* { name: 'profile', kind: RelationKind.ONE_TO_ONE, mappedEntity: 'Profile' },
|
|
293
|
+
* { name: 'posts', kind: RelationKind.ONE_TO_MANY, mappedEntity: 'Post', mappedProperty: 'author' }
|
|
294
|
+
* ]
|
|
295
|
+
* })
|
|
296
|
+
* class User extends EntityBase {}
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
export interface EntityMetadataOptions {
|
|
300
|
+
/**
|
|
301
|
+
* 命名空间
|
|
302
|
+
* 只能包含小写的英文字母
|
|
303
|
+
* 在 postgres 里会变成 schema
|
|
304
|
+
* 在 sqlite 会变成 table 的前缀
|
|
305
|
+
* @example "app", "system"
|
|
306
|
+
* @default "public"
|
|
307
|
+
*/
|
|
308
|
+
namespace?: Lowercase<string>;
|
|
309
|
+
/**
|
|
310
|
+
* 名称
|
|
311
|
+
*/
|
|
312
|
+
name: Capitalize<string>;
|
|
313
|
+
/**
|
|
314
|
+
* 自定义 repository
|
|
315
|
+
*/
|
|
316
|
+
repository?: 'Repository' | 'TreeRepository' | string;
|
|
317
|
+
/**
|
|
318
|
+
* 继承的基类
|
|
319
|
+
*/
|
|
320
|
+
extends?: string[];
|
|
321
|
+
/**
|
|
322
|
+
* 是否开启日志
|
|
323
|
+
*/
|
|
324
|
+
log?: boolean;
|
|
325
|
+
/**
|
|
326
|
+
* 实体同步配置
|
|
327
|
+
*/
|
|
328
|
+
sync?: SyncOptions;
|
|
329
|
+
/**
|
|
330
|
+
* 显示名称
|
|
331
|
+
* @example "用户", "订单项"
|
|
332
|
+
*/
|
|
333
|
+
displayName?: string;
|
|
334
|
+
/**
|
|
335
|
+
* 是否为抽象实体
|
|
336
|
+
* 抽象类是不能被实例化的
|
|
337
|
+
*/
|
|
338
|
+
abstract?: boolean;
|
|
339
|
+
/**
|
|
340
|
+
* 实体的属性表
|
|
341
|
+
* 自己定义的属性,不包括继承的
|
|
342
|
+
*/
|
|
343
|
+
properties?: EntityPropertyMetadataOptions[];
|
|
344
|
+
/**
|
|
345
|
+
* 实体的关系配置
|
|
346
|
+
* 自己定义的关系,不包括继承的
|
|
347
|
+
*
|
|
348
|
+
* 定义实体与其他实体之间的关联关系,支持四种关系类型:
|
|
349
|
+
* - ONE_TO_ONE:一对一关系,如用户和用户资料
|
|
350
|
+
* - ONE_TO_MANY:一对多关系,如用户和用户的多篇文章
|
|
351
|
+
* - MANY_TO_ONE:多对一关系,如多篇文章和一个作者
|
|
352
|
+
* - MANY_TO_MANY:多对多关系,如学生和课程
|
|
353
|
+
*
|
|
354
|
+
* 系统会根据关系配置自动处理外键、查询和关联操作
|
|
355
|
+
*/
|
|
356
|
+
relations?: EntityRelationMetadataOptions[];
|
|
357
|
+
/**
|
|
358
|
+
* 实体的索引配置
|
|
359
|
+
* 自己定义的索引,不包括继承的
|
|
360
|
+
*/
|
|
361
|
+
indexes?: EntityIndexMetadataOptions[];
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* 同步适配器选项接口
|
|
365
|
+
* 定义数据同步适配器的配置
|
|
366
|
+
*/
|
|
367
|
+
export interface SyncAdapterOptions {
|
|
368
|
+
adapter: string;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 同步类型枚举
|
|
372
|
+
* 定义不同的数据同步策略,控制本地数据和远程数据之间的同步方式
|
|
373
|
+
*
|
|
374
|
+
* 支持四种同步策略:
|
|
375
|
+
* - Full:全量同步,同步所有数据
|
|
376
|
+
* - Filter:条件同步,根据过滤条件同步部分数据
|
|
377
|
+
* - None:不同步,可以配置为只使用本地数据或只使用远程数据
|
|
378
|
+
*/
|
|
379
|
+
export declare enum SyncType {
|
|
380
|
+
/**
|
|
381
|
+
* 全量同步
|
|
382
|
+
*/
|
|
383
|
+
Full = "full",
|
|
384
|
+
/**
|
|
385
|
+
* 根据查询同步
|
|
386
|
+
*/
|
|
387
|
+
Filter = "filter",
|
|
388
|
+
/**
|
|
389
|
+
* 不同步
|
|
390
|
+
*/
|
|
391
|
+
None = "None"
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* 全量同步配置接口
|
|
395
|
+
* 定义完整数据同步的配置
|
|
396
|
+
*/
|
|
397
|
+
interface SyncFull {
|
|
398
|
+
type: SyncType.Full;
|
|
399
|
+
local: SyncAdapterOptions;
|
|
400
|
+
remote: SyncAdapterOptions;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* 条件同步配置接口
|
|
404
|
+
* 定义基于过滤条件的数据同步配置
|
|
405
|
+
*/
|
|
406
|
+
interface SyncFilter {
|
|
407
|
+
type: SyncType.Filter;
|
|
408
|
+
local: SyncAdapterOptions;
|
|
409
|
+
remote: SyncAdapterOptions;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* 远程数据配置接口
|
|
413
|
+
* 定义只访问远程数据而不同步到本地的配置
|
|
414
|
+
*/
|
|
415
|
+
interface Remote {
|
|
416
|
+
type: SyncType.None;
|
|
417
|
+
local?: SyncAdapterOptions;
|
|
418
|
+
remote: SyncAdapterOptions;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* 本地数据配置接口
|
|
422
|
+
* 定义只访问本地数据而不同步到远程的配置
|
|
423
|
+
*/
|
|
424
|
+
interface Local {
|
|
425
|
+
type: SyncType.None;
|
|
426
|
+
local: SyncAdapterOptions;
|
|
427
|
+
remote?: SyncAdapterOptions;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* 同步配置联合类型
|
|
431
|
+
* 包含所有可能的同步配置类型
|
|
432
|
+
*/
|
|
433
|
+
export type SyncOptions = SyncFull | SyncFilter | Remote | Local;
|
|
434
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ReadonlyDeep, SetRequired } from 'type-fest';
|
|
2
|
+
import { EntityIndexMetadataOptions, EntityMetadataOptions, EntityPropertyMetadata, EntityRelationMetadata } from './entity-metadata-options.interface';
|
|
3
|
+
export type EntityIndexMetadata = EntityIndexMetadataOptions;
|
|
4
|
+
/**
|
|
5
|
+
* 实体元数据类型
|
|
6
|
+
* 包含实体的所有元数据信息,如属性、关系、索引等
|
|
7
|
+
*/
|
|
8
|
+
export type EntityMetadataType = SetRequired<EntityMetadataOptions, 'namespace' | 'displayName' | 'repository'> & {
|
|
9
|
+
properties: EntityPropertyMetadata[];
|
|
10
|
+
relations: EntityRelationMetadata[];
|
|
11
|
+
indexes: EntityIndexMetadata[];
|
|
12
|
+
/**
|
|
13
|
+
* 继承的实体名称列表
|
|
14
|
+
* 表示当前实体继承自哪些实体
|
|
15
|
+
*/
|
|
16
|
+
extends: string[];
|
|
17
|
+
/**
|
|
18
|
+
* 自定义仓库名称
|
|
19
|
+
* 指定实体使用的仓库类型,可以是标准仓库、树形仓库或自定义仓库
|
|
20
|
+
*/
|
|
21
|
+
repository: 'Repository' | 'TreeRepository' | string;
|
|
22
|
+
/**
|
|
23
|
+
* 实体所有属性的映射
|
|
24
|
+
* 键为属性名,值为属性元数据
|
|
25
|
+
*/
|
|
26
|
+
propertyMap: Map<string, EntityPropertyMetadata>;
|
|
27
|
+
/**
|
|
28
|
+
* 有默认值的属性列表
|
|
29
|
+
* 包含所有设置了默认值的属性元数据
|
|
30
|
+
*/
|
|
31
|
+
defaultValueProperties: EntityPropertyMetadata[];
|
|
32
|
+
/**
|
|
33
|
+
* 实体所有关系的映射
|
|
34
|
+
* 键为关系属性名,值为关系元数据
|
|
35
|
+
*/
|
|
36
|
+
relationMap: Map<string, EntityRelationMetadata>;
|
|
37
|
+
/**
|
|
38
|
+
* 实体外键关系的映射
|
|
39
|
+
*/
|
|
40
|
+
foreignKeyRelationMap: Map<string, EntityRelationMetadata>;
|
|
41
|
+
/**
|
|
42
|
+
* 实体外键关系列表
|
|
43
|
+
* 包含所有涉及外键的关系元数据
|
|
44
|
+
*/
|
|
45
|
+
foreignKeyRelations: EntityRelationMetadata[];
|
|
46
|
+
/**
|
|
47
|
+
* 实体外键名称列表
|
|
48
|
+
* 包含所有外键字段的名称
|
|
49
|
+
*/
|
|
50
|
+
foreignKeyNames: string[];
|
|
51
|
+
/**
|
|
52
|
+
* 实体所有索引的映射
|
|
53
|
+
* 键为索引名,值为索引元数据
|
|
54
|
+
*/
|
|
55
|
+
indexMap: Map<string, EntityIndexMetadata>;
|
|
56
|
+
/**
|
|
57
|
+
* 判断属性名是否是外键
|
|
58
|
+
*
|
|
59
|
+
* @param name - 要检查的属性名
|
|
60
|
+
*/
|
|
61
|
+
isForeignKey(name: string): boolean;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* 实体元数据(只读版本)
|
|
65
|
+
* 实体元数据的只读深度副本,防止元数据被修改
|
|
66
|
+
*/
|
|
67
|
+
export type EntityMetadata = ReadonlyDeep<EntityMetadataType>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* 实体类型
|
|
4
|
+
* 表示可实例化的实体构造函数类型
|
|
5
|
+
*/
|
|
6
|
+
export type EntityType = new (initData?: any) => any;
|
|
7
|
+
/**
|
|
8
|
+
* 抽象实体类型
|
|
9
|
+
* 表示不可直接实例化的抽象实体构造函数类型
|
|
10
|
+
*/
|
|
11
|
+
export type AbstractEntityType = abstract new (initData?: any) => any;
|
|
12
|
+
/**
|
|
13
|
+
* 实体基础接口
|
|
14
|
+
* 定义所有实体共有的基本属性,为了能更好地与远程数据同步
|
|
15
|
+
* 所有实体类都应该实现这个接口
|
|
16
|
+
*/
|
|
17
|
+
export interface IEntity {
|
|
18
|
+
/**
|
|
19
|
+
* id
|
|
20
|
+
*/
|
|
21
|
+
id: UUID;
|
|
22
|
+
/**
|
|
23
|
+
* 创建时间
|
|
24
|
+
*/
|
|
25
|
+
createdAt: Date;
|
|
26
|
+
/**
|
|
27
|
+
* 更新时间
|
|
28
|
+
*/
|
|
29
|
+
updatedAt: Date;
|
|
30
|
+
/**
|
|
31
|
+
* 删除时间
|
|
32
|
+
*/
|
|
33
|
+
removedAt?: Date | null;
|
|
34
|
+
/**
|
|
35
|
+
* 创建人
|
|
36
|
+
*/
|
|
37
|
+
createdBy?: string | null;
|
|
38
|
+
/**
|
|
39
|
+
* 更新人
|
|
40
|
+
*/
|
|
41
|
+
updatedBy?: string | null;
|
|
42
|
+
/**
|
|
43
|
+
* 删除人
|
|
44
|
+
*/
|
|
45
|
+
removedBy?: string | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* UUID类型
|
|
49
|
+
* 表示标准的UUID字符串格式
|
|
50
|
+
* 格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
51
|
+
*/
|
|
52
|
+
export type UUID = `${string}-${string}-${string}-${string}-${string}`;
|
|
53
|
+
/**
|
|
54
|
+
* 单个关系对象的访问接口
|
|
55
|
+
* 提供对单个关联实体的观察和操作能力
|
|
56
|
+
*/
|
|
57
|
+
export interface RelationEntityObservable<T> extends Observable<T> {
|
|
58
|
+
/**
|
|
59
|
+
* 设置关联实体
|
|
60
|
+
*
|
|
61
|
+
* @param entity - 要设置的实体或null(解除关联)
|
|
62
|
+
*/
|
|
63
|
+
set: (entity: T | null) => void;
|
|
64
|
+
/**
|
|
65
|
+
* 移除关联实体
|
|
66
|
+
* 相当于设置为null
|
|
67
|
+
*/
|
|
68
|
+
remove: () => void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 多个关系对象的访问接口
|
|
72
|
+
* 提供对多个关联实体集合的观察和操作能力
|
|
73
|
+
*/
|
|
74
|
+
export interface RelationEntitiesObservable<T> extends Observable<T[]> {
|
|
75
|
+
/**
|
|
76
|
+
* 关联实体数量的可观察对象
|
|
77
|
+
*/
|
|
78
|
+
count$: Observable<number>;
|
|
79
|
+
/**
|
|
80
|
+
* 添加关联实体
|
|
81
|
+
*
|
|
82
|
+
* @param entities - 要添加的实体列表
|
|
83
|
+
*/
|
|
84
|
+
add: (...entities: T[]) => void;
|
|
85
|
+
/**
|
|
86
|
+
* 移除关联实体
|
|
87
|
+
*
|
|
88
|
+
* @param entities - 要移除的实体列表
|
|
89
|
+
*/
|
|
90
|
+
remove: (...entities: T[]) => void;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* SQLite行ID类型
|
|
94
|
+
* 表示SQLite数据库中的rowid
|
|
95
|
+
*/
|
|
96
|
+
export type SqliteRowId = bigint;
|
|
97
|
+
/**
|
|
98
|
+
* PostgreSQL物理行标识类型
|
|
99
|
+
* 表示PostgreSQL数据库中的ctid(物理行位置标识)
|
|
100
|
+
* 格式为:(块号,块内偏移)
|
|
101
|
+
*
|
|
102
|
+
* @see http://postgres.cn/docs/16/ddl-system-columns.html#DDL-SYSTEM-COLUMNS-CTID
|
|
103
|
+
*/
|
|
104
|
+
export type PostgresCtId = `(${number},${number})`;
|
|
105
|
+
/**
|
|
106
|
+
* 数据库行标识类型
|
|
107
|
+
* 统一表示不同数据库中的行标识
|
|
108
|
+
* 在SQLite中主要用于通过观察数据库变化找到级联删除的实体
|
|
109
|
+
*/
|
|
110
|
+
export type RowId = SqliteRowId | PostgresCtId;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { EntityMetadata } from './entity-metadata.interface';
|
|
2
|
+
import { EntityType } from './entity.interface';
|
|
3
|
+
/**
|
|
4
|
+
* 判断字段名是否是内部保留字段
|
|
5
|
+
* 包括基类字段、私有字段和以下划线开头的字段
|
|
6
|
+
*
|
|
7
|
+
* @param key - 要检查的字段名
|
|
8
|
+
* @returns 如果是内部保留字段则返回true,否则返回false
|
|
9
|
+
*/
|
|
10
|
+
export declare const isEntityInternalName: (key: string) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 设置安全的不可变属性
|
|
13
|
+
* 创建一个不可枚举、不可配置、不可写的属性
|
|
14
|
+
*
|
|
15
|
+
* @param object - 目标对象
|
|
16
|
+
* @param key - 属性键
|
|
17
|
+
* @param value - 属性值
|
|
18
|
+
* @returns 修改后的对象
|
|
19
|
+
*/
|
|
20
|
+
export declare const setSafeObjectKey: (object: object, key: string | symbol, value: any) => object;
|
|
21
|
+
/**
|
|
22
|
+
* 设置安全的可变属性
|
|
23
|
+
* 创建一个不可枚举、不可配置但可写的属性
|
|
24
|
+
*
|
|
25
|
+
* @param object - 目标对象
|
|
26
|
+
* @param key - 属性键
|
|
27
|
+
* @param value - 属性值
|
|
28
|
+
* @returns 修改后的对象
|
|
29
|
+
*/
|
|
30
|
+
export declare const setSafeObjectWritableKey: (object: object, key: string | symbol, value: any) => object;
|
|
31
|
+
/**
|
|
32
|
+
* 设置懒加载属性
|
|
33
|
+
* 创建一个只在首次访问时计算值的属性,后续访问直接返回计算结果
|
|
34
|
+
*
|
|
35
|
+
* @param object - 目标对象
|
|
36
|
+
* @param key - 属性键
|
|
37
|
+
* @param init - 初始化函数,用于计算属性值
|
|
38
|
+
* @returns 修改后的对象
|
|
39
|
+
*/
|
|
40
|
+
export declare const setSafeObjectKeyLazyInitOnce: (object: object, key: string | symbol, init: () => any) => object;
|
|
41
|
+
/**
|
|
42
|
+
* 给实体实例填充默认值
|
|
43
|
+
* 根据元数据中定义的默认值,为实体的未赋值属性设置默认值
|
|
44
|
+
*
|
|
45
|
+
* @template T - 实体类型
|
|
46
|
+
* @param metadata - 实体元数据
|
|
47
|
+
* @param entity - 实体实例
|
|
48
|
+
*/
|
|
49
|
+
export declare const fillDefaultValue: <T extends EntityType>(metadata: EntityMetadata, entity: InstanceType<T>) => void;
|
|
50
|
+
/**
|
|
51
|
+
* 给实体实例填充初始值
|
|
52
|
+
* 根据提供的初始值对象,为实体的属性设置值,同时尊重只读属性
|
|
53
|
+
*
|
|
54
|
+
* @template T - 实体类型
|
|
55
|
+
* @param metadata - 实体元数据
|
|
56
|
+
* @param entity - 实体实例
|
|
57
|
+
* @param initValue - 初始值对象
|
|
58
|
+
*/
|
|
59
|
+
export declare const fillInitValue: <T extends EntityType>(metadata: EntityMetadata, entity: InstanceType<T>, initValue: Partial<InstanceType<T>>) => void;
|