@aiao/rxdb-query-builder 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1224 -0
- package/dist/models/config.interface.d.ts +76 -0
- package/dist/models/config.interface.d.ts.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/operator.interface.d.ts +42 -0
- package/dist/models/operator.interface.d.ts.map +1 -0
- package/dist/models/query-builder-state.d.ts +155 -0
- package/dist/models/query-builder-state.d.ts.map +1 -0
- package/dist/models/validation.interface.d.ts +88 -0
- package/dist/models/validation.interface.d.ts.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/operator-registry.service.d.ts +132 -0
- package/dist/services/operator-registry.service.d.ts.map +1 -0
- package/dist/services/query-builder.service.d.ts +147 -0
- package/dist/services/query-builder.service.d.ts.map +1 -0
- package/dist/services/query-converter.service.d.ts +74 -0
- package/dist/services/query-converter.service.d.ts.map +1 -0
- package/dist/services/schema-parser.service.d.ts +83 -0
- package/dist/services/schema-parser.service.d.ts.map +1 -0
- package/dist/services/validation.service.d.ts +67 -0
- package/dist/services/validation.service.d.ts.map +1 -0
- package/dist/utils/field-tree.d.ts +119 -0
- package/dist/utils/field-tree.d.ts.map +1 -0
- package/dist/utils/id.d.ts +9 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/metadata-field-extractor.d.ts +150 -0
- package/dist/utils/metadata-field-extractor.d.ts.map +1 -0
- package/dist/utils/schema-factory.d.ts +60 -0
- package/dist/utils/schema-factory.d.ts.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.service.d.ts","sourceRoot":"","sources":["../../src/services/query-builder.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { RuleGroup } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { QueryBuilderState } from '../models/query-builder-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* 转换选项
|
|
5
|
+
*/
|
|
6
|
+
export interface QueryConverterOptions {
|
|
7
|
+
/**
|
|
8
|
+
* ID 生成器
|
|
9
|
+
* @default generateId()
|
|
10
|
+
*/
|
|
11
|
+
idGenerator?: () => string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Query 转换服务
|
|
15
|
+
* 负责 QueryBuilder 状态与 RxDB Query 之间的双向转换
|
|
16
|
+
*/
|
|
17
|
+
export declare class QueryConverter<T = Record<string, unknown>> {
|
|
18
|
+
private readonly idGenerator;
|
|
19
|
+
constructor(options?: QueryConverterOptions);
|
|
20
|
+
/**
|
|
21
|
+
* 将 QueryBuilder 状态转换为 RxDB Query
|
|
22
|
+
*
|
|
23
|
+
* @param state - QueryBuilder 状态
|
|
24
|
+
* @returns RxDB RuleGroup 查询对象
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const converter = new QueryConverter<User>();
|
|
29
|
+
* const query = converter.toRxDBQuery(queryBuilderState);
|
|
30
|
+
* // { combinator: 'and', rules: [...] }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
toRxDBQuery(state: QueryBuilderState<T>): RuleGroup<T>;
|
|
34
|
+
/**
|
|
35
|
+
* 将 RxDB Query 转换为 QueryBuilder 状态
|
|
36
|
+
*
|
|
37
|
+
* @param query - RxDB RuleGroup 查询对象
|
|
38
|
+
* @returns QueryBuilder 状态
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const converter = new QueryConverter<User>();
|
|
43
|
+
* const state = converter.fromRxDBQuery(rxdbQuery);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
fromRxDBQuery(query: RuleGroup<T>): QueryBuilderState<T>;
|
|
47
|
+
/**
|
|
48
|
+
* 转换单个规则组到 RxDB 格式
|
|
49
|
+
*/
|
|
50
|
+
private convertGroupToRxDB;
|
|
51
|
+
/**
|
|
52
|
+
* 转换单条规则到 RxDB 格式
|
|
53
|
+
* 移除 QueryBuilder 特有的 id 字段
|
|
54
|
+
*/
|
|
55
|
+
private convertRuleToRxDB;
|
|
56
|
+
/**
|
|
57
|
+
* 从 RxDB 格式转换规则组
|
|
58
|
+
*/
|
|
59
|
+
private convertGroupFromRxDB;
|
|
60
|
+
/**
|
|
61
|
+
* 从 RxDB 格式转换单条规则
|
|
62
|
+
* 添加 QueryBuilder 需要的 id 字段
|
|
63
|
+
*/
|
|
64
|
+
private convertRuleFromRxDB;
|
|
65
|
+
/**
|
|
66
|
+
* 判断是否为 RxDB RuleGroup
|
|
67
|
+
*/
|
|
68
|
+
private isRxDBRuleGroup;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 创建 QueryConverter 实例的工厂函数
|
|
72
|
+
*/
|
|
73
|
+
export declare function createQueryConverter<T = Record<string, unknown>>(options?: QueryConverterOptions): QueryConverter<T>;
|
|
74
|
+
//# sourceMappingURL=query-converter.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-converter.service.d.ts","sourceRoot":"","sources":["../../src/services/query-converter.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAA2C,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAInH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;gBAE/B,OAAO,GAAE,qBAA0B;IAI/C;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAItD;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAMxD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,eAAe;CASxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAAC,CAAC,CAAC,CAEpH"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { EntityMetadata } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { FieldMetadata } from '../models/query-builder-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* 解析器配置选项
|
|
5
|
+
*/
|
|
6
|
+
export interface SchemaParserOptions {
|
|
7
|
+
/**
|
|
8
|
+
* 是否包含外键字段
|
|
9
|
+
* @default false
|
|
10
|
+
*/
|
|
11
|
+
includeForeignKeys?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* 是否包含计算属性
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
includeComputedProperties?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 是否包含关系字段(用于 EXISTS 操作符)
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
includeRelations?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 实体元数据映射(用于解析关系字段的目标实体字段)
|
|
24
|
+
* 键为实体名称,值为实体元数据
|
|
25
|
+
*/
|
|
26
|
+
entityMetadataMap?: Map<string, EntityMetadata>;
|
|
27
|
+
/**
|
|
28
|
+
* 自定义字段过滤器
|
|
29
|
+
*/
|
|
30
|
+
fieldFilter?: (field: FieldMetadata) => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* 自定义显示名称生成器
|
|
33
|
+
*/
|
|
34
|
+
displayNameGenerator?: (fieldName: string, metadata?: {
|
|
35
|
+
displayName?: string;
|
|
36
|
+
}) => string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Schema 解析服务
|
|
40
|
+
* 负责将 RxDB EntityMetadata 转换为 QueryBuilder 可用的字段元数据
|
|
41
|
+
*/
|
|
42
|
+
export declare class SchemaParser {
|
|
43
|
+
private readonly options;
|
|
44
|
+
constructor(options?: SchemaParserOptions);
|
|
45
|
+
/**
|
|
46
|
+
* 从 EntityMetadata 解析字段元数据
|
|
47
|
+
*
|
|
48
|
+
* @param metadata - RxDB 实体元数据
|
|
49
|
+
* @returns 字段元数据数组
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const parser = new SchemaParser();
|
|
54
|
+
* const fields = parser.parse(userMetadata);
|
|
55
|
+
* // [{ name: 'id', displayName: 'ID', type: 'string' }, ...]
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
parse(metadata: EntityMetadata): FieldMetadata[];
|
|
59
|
+
/**
|
|
60
|
+
* 从多个 EntityMetadata 批量解析
|
|
61
|
+
*
|
|
62
|
+
* @param metadataMap - 实体名称到元数据的映射
|
|
63
|
+
* @returns 实体名称到字段数组的映射
|
|
64
|
+
*/
|
|
65
|
+
parseMany(metadataMap: Map<string, EntityMetadata>): Map<string, FieldMetadata[]>;
|
|
66
|
+
/**
|
|
67
|
+
* 解析单个属性
|
|
68
|
+
*/
|
|
69
|
+
private parseProperty;
|
|
70
|
+
/**
|
|
71
|
+
* 将 RxDB PropertyType 映射到 QueryBuilder 类型
|
|
72
|
+
*/
|
|
73
|
+
private mapPropertyType;
|
|
74
|
+
/**
|
|
75
|
+
* 解析关系字段
|
|
76
|
+
*/
|
|
77
|
+
private parseRelation;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 创建 SchemaParser 实例的工厂函数
|
|
81
|
+
*/
|
|
82
|
+
export declare function createSchemaParser(options?: SchemaParserOptions): SchemaParser;
|
|
83
|
+
//# sourceMappingURL=schema-parser.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-parser.service.d.ts","sourceRoot":"","sources":["../../src/services/schema-parser.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAmBtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAEhD;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;CAC3F;AA4BD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;gBAEU,OAAO,GAAE,mBAAwB;IAW7C;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,EAAE;IAuChD;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAUjF;;OAEG;IACH,OAAO,CAAC,aAAa;IA6CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAgCtB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE9E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { FieldMetadata, QueryBuilderRule, QueryBuilderRuleGroup } from '../models/query-builder-state.js';
|
|
2
|
+
import { ValidationResult, ValidationRule } from '../models/validation.interface.js';
|
|
3
|
+
import { OperatorRegistry } from './operator-registry.service.js';
|
|
4
|
+
/**
|
|
5
|
+
* 校验服务选项
|
|
6
|
+
*/
|
|
7
|
+
export interface ValidationServiceOptions {
|
|
8
|
+
/**
|
|
9
|
+
* 自定义校验规则
|
|
10
|
+
*/
|
|
11
|
+
customRules?: ValidationRule[];
|
|
12
|
+
/**
|
|
13
|
+
* 操作符注册表
|
|
14
|
+
*/
|
|
15
|
+
operatorRegistry?: OperatorRegistry;
|
|
16
|
+
/**
|
|
17
|
+
* 是否启用内置校验规则
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
useBuiltinRules?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 校验服务
|
|
24
|
+
* 负责验证 QueryBuilder 规则和值
|
|
25
|
+
*/
|
|
26
|
+
export declare class ValidationService {
|
|
27
|
+
private readonly rules;
|
|
28
|
+
private readonly operatorRegistry;
|
|
29
|
+
constructor(options?: ValidationServiceOptions);
|
|
30
|
+
/**
|
|
31
|
+
* 校验单条规则
|
|
32
|
+
*/
|
|
33
|
+
validateRule<T>(rule: QueryBuilderRule<T>, field: FieldMetadata): ValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* 校验整个规则组
|
|
36
|
+
*/
|
|
37
|
+
validateGroup<T>(group: QueryBuilderRuleGroup<T>, fields: Map<string, FieldMetadata>): ValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* 注册自定义校验规则
|
|
40
|
+
*/
|
|
41
|
+
registerRule(rule: ValidationRule): void;
|
|
42
|
+
/**
|
|
43
|
+
* 移除校验规则
|
|
44
|
+
*/
|
|
45
|
+
unregisterRule(name: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 获取所有校验规则
|
|
48
|
+
*/
|
|
49
|
+
getRules(): ValidationRule[];
|
|
50
|
+
/**
|
|
51
|
+
* 校验值类型
|
|
52
|
+
*/
|
|
53
|
+
private validateValueType;
|
|
54
|
+
/**
|
|
55
|
+
* 验证子查询规则的基本有效性(不依赖字段元数据)
|
|
56
|
+
*
|
|
57
|
+
* @description
|
|
58
|
+
* 子查询可能引用关系实体的字段,我们无法获取其 FieldMetadata。
|
|
59
|
+
* 因此只验证规则的基本结构和值类型,不验证字段是否存在或操作符是否匹配。
|
|
60
|
+
*/
|
|
61
|
+
private validateSubqueryRules;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 创建 ValidationService 实例的工厂函数
|
|
65
|
+
*/
|
|
66
|
+
export declare function createValidationService(options?: ValidationServiceOptions): ValidationService;
|
|
67
|
+
//# sourceMappingURL=validation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.service.d.ts","sourceRoot":"","sources":["../../src/services/validation.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE/G,OAAO,KAAK,EAGV,gBAAgB,EAChB,cAAc,EACf,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAA8B,MAAM,gCAAgC,CAAC;AAe9F;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,OAAO,GAAE,wBAA6B;IAmBlD;;OAEG;IACH,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,GAAG,gBAAgB;IA4FlF;;OAEG;IACH,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,gBAAgB;IAiCvG;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIxC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,QAAQ,IAAI,cAAc,EAAE;IAI5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoDzB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CAgD9B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,iBAAiB,CAE7F"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
|
|
2
|
+
/**
|
|
3
|
+
* 字段树节点(用于 CascadeSelect)
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* 将扁平的 FieldMetadata[] 转换为树形结构,
|
|
7
|
+
* 以便 CascadeSelect 组件级联展示嵌套字段。
|
|
8
|
+
*/
|
|
9
|
+
export interface FieldTreeNode {
|
|
10
|
+
/** 当前层的字段名 */
|
|
11
|
+
label: string;
|
|
12
|
+
/** 完整路径(作为选中值) */
|
|
13
|
+
value: string;
|
|
14
|
+
/** 显示名称 */
|
|
15
|
+
displayName: string;
|
|
16
|
+
/** 字段类型 */
|
|
17
|
+
type: PropertyType;
|
|
18
|
+
/** 是否是关系字段 */
|
|
19
|
+
isRelation: boolean;
|
|
20
|
+
/** 子节点 */
|
|
21
|
+
children?: FieldTreeNode[];
|
|
22
|
+
/** 字段描述 */
|
|
23
|
+
description?: string;
|
|
24
|
+
/** 是否必填 */
|
|
25
|
+
required?: boolean;
|
|
26
|
+
/** 枚举值 */
|
|
27
|
+
enum?: unknown[];
|
|
28
|
+
/** 关系目标实体的字段列表(用于 EXISTS 子查询) */
|
|
29
|
+
relationFields?: FieldMetadata[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 将扁平字段列表转换为树结构
|
|
33
|
+
*
|
|
34
|
+
* @description
|
|
35
|
+
* 将 `orders.items.productName` 这样的扁平路径转换为嵌套树结构:
|
|
36
|
+
* ```
|
|
37
|
+
* orders
|
|
38
|
+
* └── items
|
|
39
|
+
* └── productName
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @param fields 扁平的字段元数据列表
|
|
43
|
+
* @returns 树形结构的字段节点
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const fields = [
|
|
48
|
+
* { name: 'name', displayName: '姓名', type: 'string' },
|
|
49
|
+
* { name: 'orders', displayName: '订单', type: 'relation' },
|
|
50
|
+
* { name: 'orders.amount', displayName: '订单.金额', type: 'number' }
|
|
51
|
+
* ];
|
|
52
|
+
* const tree = buildFieldTree(fields);
|
|
53
|
+
* // tree[0] = { label: 'name', displayName: '姓名', ... }
|
|
54
|
+
* // tree[1] = { label: 'orders', displayName: '订单', children: [...] }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildFieldTree(fields: FieldMetadata[]): FieldTreeNode[];
|
|
58
|
+
/**
|
|
59
|
+
* 在树中查找节点
|
|
60
|
+
*
|
|
61
|
+
* @param nodes 树节点列表
|
|
62
|
+
* @param value 要查找的值(完整路径)
|
|
63
|
+
* @returns 找到的节点或 undefined
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const node = findNodeByValue(tree, 'orders.items.productName');
|
|
68
|
+
* console.log(node?.displayName); // '商品名称'
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function findNodeByValue(nodes: FieldTreeNode[], value: string): FieldTreeNode | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* 创建字段名到节点的映射
|
|
74
|
+
*
|
|
75
|
+
* @description
|
|
76
|
+
* 递归遍历树结构,创建一个 Map 用于快速查找节点。
|
|
77
|
+
* 对于需要频繁查找的场景,比直接递归更高效。
|
|
78
|
+
*
|
|
79
|
+
* @param tree 字段树
|
|
80
|
+
* @returns 字段名到节点的映射
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const nodeMap = createFieldNodeMap(tree);
|
|
85
|
+
* const node = nodeMap.get('orders.amount');
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function createFieldNodeMap(tree: FieldTreeNode[]): Map<string, FieldTreeNode>;
|
|
89
|
+
/**
|
|
90
|
+
* 获取 CascadeSelect 的 optionGroupChildren 配置
|
|
91
|
+
*
|
|
92
|
+
* @description
|
|
93
|
+
* CascadeSelect 需要知道每一层的子节点属性名。
|
|
94
|
+
* 由于我们统一使用 'children',返回重复的 ['children', 'children', ...]
|
|
95
|
+
* 深度根据最大嵌套层级决定。
|
|
96
|
+
*
|
|
97
|
+
* @param maxDepth 最大深度,默认 10
|
|
98
|
+
* @returns children 属性名数组
|
|
99
|
+
*/
|
|
100
|
+
export declare function getOptionGroupChildren(maxDepth?: number): string[];
|
|
101
|
+
/**
|
|
102
|
+
* 获取完整的 displayName 路径
|
|
103
|
+
*
|
|
104
|
+
* @description
|
|
105
|
+
* 给定字段路径(如 `orders.createdAt`),返回完整的显示名路径(如 `订单.创建时间`)。
|
|
106
|
+
* 通过遍历树结构,将每一级的 displayName 拼接起来。
|
|
107
|
+
*
|
|
108
|
+
* @param tree 字段树
|
|
109
|
+
* @param value 字段路径(如 `orders.createdAt`)
|
|
110
|
+
* @returns 显示名路径(如 `订单.创建时间`)
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* const displayPath = getDisplayNamePath(tree, 'orders.createdAt');
|
|
115
|
+
* console.log(displayPath); // '订单.创建时间'
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export declare function getDisplayNamePath(tree: FieldTreeNode[], value: string): string;
|
|
119
|
+
//# sourceMappingURL=field-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-tree.d.ts","sourceRoot":"","sources":["../../src/utils/field-tree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAIpF;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,cAAc;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU;IACV,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU;IACV,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,iCAAiC;IACjC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAiHvE;AA8CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAWhG;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAcpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,SAAK,GAAG,MAAM,EAAE,CAE9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { EntityMetadata, EntityRelationMetadata, PropertyType } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { FieldMetadata, PropertyType as QBPropertyType } from '../models/query-builder-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* 模型信息接口
|
|
5
|
+
*/
|
|
6
|
+
export interface ModelInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
entityClass: new (...args: any[]) => any;
|
|
10
|
+
metadata: EntityMetadata;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 查询示例接口
|
|
14
|
+
*/
|
|
15
|
+
export interface QueryExample {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
modelName: string;
|
|
19
|
+
query: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 字段提取器配置
|
|
23
|
+
*/
|
|
24
|
+
export interface FieldExtractorConfig {
|
|
25
|
+
/** 关系查询深度,默认 4 */
|
|
26
|
+
relationQueryDeep?: number;
|
|
27
|
+
/** 系统字段列表,默认 ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'] */
|
|
28
|
+
systemFields?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 将 PropertyType 映射到 FieldMetadata 的 type
|
|
32
|
+
*
|
|
33
|
+
* @param type - RxDB 属性类型
|
|
34
|
+
* @returns QueryBuilder 属性类型
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* mapPropertyType(PropertyType.string) // 'string'
|
|
39
|
+
* mapPropertyType(PropertyType.number) // 'number'
|
|
40
|
+
* mapPropertyType(PropertyType.boolean) // 'boolean'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function mapPropertyType(type: PropertyType): QBPropertyType;
|
|
44
|
+
/**
|
|
45
|
+
* 获取关系需要忽略的键(避免循环引用)
|
|
46
|
+
*
|
|
47
|
+
* @param relation - 实体关系元数据
|
|
48
|
+
* @returns 需要忽略的键列表
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* 对于 ONE_TO_MANY 和 MANY_TO_MANY 关系,返回 mappedProperty(如果存在)
|
|
52
|
+
* 以避免无限递归
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // ONE_TO_MANY: User.orders -> Order.owner
|
|
57
|
+
* getRelationIgnoreKeys(ordersRelation) // ['owner']
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function getRelationIgnoreKeys(relation: EntityRelationMetadata): string[];
|
|
61
|
+
/**
|
|
62
|
+
* 从 EntityMetadata 提取字段(支持递归关系)
|
|
63
|
+
*
|
|
64
|
+
* @param metadata - 实体元数据
|
|
65
|
+
* @param allModels - 所有模型的映射表
|
|
66
|
+
* @param config - 字段提取器配置
|
|
67
|
+
* @param firstMetadata - 第一个实体的元数据(用于检测循环)
|
|
68
|
+
* @param ignoreKeys - 需要忽略的字段名列表
|
|
69
|
+
* @param prefix - 字段名前缀(用于嵌套关系)
|
|
70
|
+
* @param visitedEntities - 已访问的实体集合(防止循环)
|
|
71
|
+
* @param depth - 当前递归深度
|
|
72
|
+
* @returns 字段元数据列表
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* 此函数会递归提取实体的所有字段,包括:
|
|
76
|
+
* 1. 系统字段(id, createdAt, updatedAt 等)
|
|
77
|
+
* 2. 实体属性字段
|
|
78
|
+
* 3. 外键字段
|
|
79
|
+
* 4. 关系字段(递归,直到达到深度限制)
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const fields = extractFieldsFromMetadata(
|
|
84
|
+
* userMetadata,
|
|
85
|
+
* modelMap,
|
|
86
|
+
* { relationQueryDeep: 3 }
|
|
87
|
+
* );
|
|
88
|
+
* // 返回: [
|
|
89
|
+
* // { name: 'id', displayName: 'ID', type: 'string' },
|
|
90
|
+
* // { name: 'name', displayName: '姓名', type: 'string' },
|
|
91
|
+
* // { name: 'orders', displayName: '订单 (ONE_TO_MANY)', type: 'relation', ... },
|
|
92
|
+
* // { name: 'orders.id', displayName: '订单.ID', type: 'string' },
|
|
93
|
+
* // ...
|
|
94
|
+
* // ]
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function extractFieldsFromMetadata(metadata: EntityMetadata, allModels: Map<string, ModelInfo>, config?: FieldExtractorConfig, firstMetadata?: EntityMetadata, ignoreKeys?: string[], prefix?: string, visitedEntities?: Set<string>, depth?: number): FieldMetadata[];
|
|
98
|
+
/**
|
|
99
|
+
* 提取关系目标实体的字段(用于 EXISTS 子查询)
|
|
100
|
+
*
|
|
101
|
+
* @param metadata - 实体元数据
|
|
102
|
+
* @param config - 字段提取器配置
|
|
103
|
+
* @returns 字段元数据列表(仅一层,不递归)
|
|
104
|
+
*
|
|
105
|
+
* @remarks
|
|
106
|
+
* 此函数只提取一层字段,不递归关系。用于 EXISTS/NOT EXISTS 子查询的字段列表。
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const fields = extractRelationTargetFields(orderMetadata);
|
|
111
|
+
* // 返回: [
|
|
112
|
+
* // { name: 'id', displayName: 'ID', type: 'string' },
|
|
113
|
+
* // { name: 'total', displayName: '总金额', type: 'number' },
|
|
114
|
+
* // { name: 'ownerId', displayName: '用户ID', type: 'string' },
|
|
115
|
+
* // ...
|
|
116
|
+
* // ]
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare function extractRelationTargetFields(metadata: EntityMetadata, config?: FieldExtractorConfig): FieldMetadata[];
|
|
120
|
+
/**
|
|
121
|
+
* 对字段进行分组和排序
|
|
122
|
+
*
|
|
123
|
+
* @param fields - 字段元数据列表
|
|
124
|
+
* @returns 排序后的字段列表
|
|
125
|
+
*
|
|
126
|
+
* @remarks
|
|
127
|
+
* 排序规则:
|
|
128
|
+
* 1. 按层级深度排序(字段名中 '.' 的数量)
|
|
129
|
+
* 2. 同一层级按字段名字母顺序排序
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* const fields = [
|
|
134
|
+
* { name: 'orders.id', ... },
|
|
135
|
+
* { name: 'name', ... },
|
|
136
|
+
* { name: 'id', ... },
|
|
137
|
+
* { name: 'orders.total', ... }
|
|
138
|
+
* ];
|
|
139
|
+
*
|
|
140
|
+
* const sorted = organizeFields(fields);
|
|
141
|
+
* // 返回: [
|
|
142
|
+
* // { name: 'id', ... },
|
|
143
|
+
* // { name: 'name', ... },
|
|
144
|
+
* // { name: 'orders.id', ... },
|
|
145
|
+
* // { name: 'orders.total', ... }
|
|
146
|
+
* // ]
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export declare function organizeFields(fields: FieldMetadata[]): FieldMetadata[];
|
|
150
|
+
//# sourceMappingURL=metadata-field-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-field-extractor.d.ts","sourceRoot":"","sources":["../../src/utils/metadata-field-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACzC,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAsBlE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAKhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACjC,MAAM,GAAE,oBAAyB,EACjC,aAAa,CAAC,EAAE,cAAc,EAC9B,UAAU,GAAE,MAAM,EAAO,EACzB,MAAM,SAAK,EACX,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,EACxC,KAAK,SAAI,GACR,aAAa,EAAE,CAkHjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,oBAAyB,GAChC,aAAa,EAAE,CA4CjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAOvE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EntityMetadata } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { FieldMetadata } from '../models/query-builder-state.js';
|
|
3
|
+
import { SchemaParserOptions } from '../services/schema-parser.service.js';
|
|
4
|
+
/**
|
|
5
|
+
* 从 EntityMetadata 创建字段元数据
|
|
6
|
+
*
|
|
7
|
+
* 这是一个便捷的工厂函数,封装了 SchemaParser 的创建和解析过程
|
|
8
|
+
*
|
|
9
|
+
* @param metadata - RxDB 实体元数据
|
|
10
|
+
* @param options - 解析器选项
|
|
11
|
+
* @returns 字段元数据数组
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // 基础用法
|
|
16
|
+
* const fields = createSchemaFromEntity(userMetadata);
|
|
17
|
+
*
|
|
18
|
+
* // 包含外键
|
|
19
|
+
* const fieldsWithFK = createSchemaFromEntity(userMetadata, {
|
|
20
|
+
* includeForeignKeys: true
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // 包含计算属性
|
|
24
|
+
* const fieldsWithComputed = createSchemaFromEntity(userMetadata, {
|
|
25
|
+
* includeComputedProperties: true
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // 自定义过滤器
|
|
29
|
+
* const onlyStringFields = createSchemaFromEntity(userMetadata, {
|
|
30
|
+
* fieldFilter: (field) => field.type === 'string'
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSchemaFromEntity(metadata: EntityMetadata, options?: SchemaParserOptions): FieldMetadata[];
|
|
35
|
+
/**
|
|
36
|
+
* 从多个 EntityMetadata 批量创建字段元数据
|
|
37
|
+
*
|
|
38
|
+
* @param metadataMap - 实体名称到元数据的映射
|
|
39
|
+
* @param options - 解析器选项
|
|
40
|
+
* @returns 实体名称到字段数组的映射
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const entities = new Map([
|
|
45
|
+
* ['User', userMetadata],
|
|
46
|
+
* ['Post', postMetadata],
|
|
47
|
+
* ['Comment', commentMetadata]
|
|
48
|
+
* ]);
|
|
49
|
+
*
|
|
50
|
+
* const schemas = createSchemaFromEntities(entities, {
|
|
51
|
+
* includeForeignKeys: true
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* // 使用结果
|
|
55
|
+
* const userFields = schemas.get('User');
|
|
56
|
+
* const postFields = schemas.get('Post');
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function createSchemaFromEntities(metadataMap: Map<string, EntityMetadata>, options?: SchemaParserOptions): Map<string, FieldMetadata[]>;
|
|
60
|
+
//# sourceMappingURL=schema-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-factory.d.ts","sourceRoot":"","sources":["../../src/utils/schema-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEpG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,EAAE,CAG/G;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACxC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAG9B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aiao/rxdb-query-builder",
|
|
3
|
+
"version": "0.0.10",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
"./package.json": "./package.json",
|
|
10
|
+
".": {
|
|
11
|
+
"@aiao/source": "./src/index.ts",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"!**/*.tsbuildinfo"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"nx": {
|
|
25
|
+
"name": "rxdb-query-builder",
|
|
26
|
+
"tags": [
|
|
27
|
+
"js-lib"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"rxjs": "^7.8.2",
|
|
32
|
+
"uuid": "^13.0.0",
|
|
33
|
+
"@aiao/rxdb": "0.0.10"
|
|
34
|
+
}
|
|
35
|
+
}
|