@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,76 @@
|
|
|
1
|
+
import { RuleGroup } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { OperatorDefinition } from './operator.interface.js';
|
|
3
|
+
import { QueryBuilderRuleGroup, SchemaInfo } from './query-builder-state.js';
|
|
4
|
+
/**
|
|
5
|
+
* 查询构建器配置
|
|
6
|
+
*/
|
|
7
|
+
export interface QueryBuilderConfig<T = Record<string, unknown>> {
|
|
8
|
+
/**
|
|
9
|
+
* Schema 信息
|
|
10
|
+
*/
|
|
11
|
+
schema?: SchemaInfo;
|
|
12
|
+
/**
|
|
13
|
+
* 初始查询
|
|
14
|
+
*/
|
|
15
|
+
initialQuery?: QueryBuilderRuleGroup<T>;
|
|
16
|
+
/**
|
|
17
|
+
* 最大嵌套层级(默认 5)
|
|
18
|
+
*/
|
|
19
|
+
maxNestingLevel?: number;
|
|
20
|
+
/**
|
|
21
|
+
* 是否启用历史记录(撤销/重做)
|
|
22
|
+
*/
|
|
23
|
+
enableHistory?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 历史记录最大长度(默认 50)
|
|
26
|
+
*/
|
|
27
|
+
maxHistoryLength?: number;
|
|
28
|
+
/**
|
|
29
|
+
* 自定义操作符
|
|
30
|
+
*/
|
|
31
|
+
customOperators?: OperatorDefinition[];
|
|
32
|
+
/**
|
|
33
|
+
* 是否只读模式
|
|
34
|
+
*/
|
|
35
|
+
readonly?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 查询构建器事件
|
|
39
|
+
*/
|
|
40
|
+
export interface QueryBuilderEvents<T = Record<string, unknown>> {
|
|
41
|
+
/**
|
|
42
|
+
* 查询变更事件
|
|
43
|
+
*/
|
|
44
|
+
queryChange: {
|
|
45
|
+
query: QueryBuilderRuleGroup<T>;
|
|
46
|
+
rxdbQuery: RuleGroup<T>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 验证错误事件
|
|
50
|
+
*/
|
|
51
|
+
validationError: {
|
|
52
|
+
id: string;
|
|
53
|
+
message: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* 规则添加事件
|
|
57
|
+
*/
|
|
58
|
+
ruleAdd: {
|
|
59
|
+
groupId: string;
|
|
60
|
+
ruleId: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* 规则删除事件
|
|
64
|
+
*/
|
|
65
|
+
ruleRemove: {
|
|
66
|
+
id: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* 组合符切换事件
|
|
70
|
+
*/
|
|
71
|
+
combinatorToggle: {
|
|
72
|
+
groupId: string;
|
|
73
|
+
combinator: 'and' | 'or';
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=config.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.interface.d.ts","sourceRoot":"","sources":["../../src/models/config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAClF;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAExC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D;;OAEG;IACH,WAAW,EAAE;QACX,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;KACzB,CAAC;IAEF;;OAEG;IACH,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF;;OAEG;IACH,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;OAEG;IACH,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IAEF;;OAEG;IACH,gBAAgB,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;KAC1B,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { OperatorName } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { PropertyType } from './query-builder-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* 操作符定义
|
|
5
|
+
* 包含操作符的元数据和约束
|
|
6
|
+
*/
|
|
7
|
+
export interface OperatorDefinition {
|
|
8
|
+
/**
|
|
9
|
+
* 操作符键值(使用 RxDB 的 OperatorName)
|
|
10
|
+
*/
|
|
11
|
+
key: OperatorName;
|
|
12
|
+
/**
|
|
13
|
+
* 显示标签(支持国际化)
|
|
14
|
+
*/
|
|
15
|
+
label: string;
|
|
16
|
+
/**
|
|
17
|
+
* 值类型
|
|
18
|
+
* - single: 单个值 (例如 "=")
|
|
19
|
+
* - array: 值数组 (例如 "in")
|
|
20
|
+
* - range: 范围值 [min, max] (例如 "between")
|
|
21
|
+
* - none: 无需值 (例如 "null")
|
|
22
|
+
* - subquery: 子查询条件 (例如 "exists" - 可选的嵌套规则组)
|
|
23
|
+
*/
|
|
24
|
+
valueType: 'single' | 'array' | 'range' | 'none' | 'subquery';
|
|
25
|
+
/**
|
|
26
|
+
* 适用的字段类型
|
|
27
|
+
*/
|
|
28
|
+
applicableTypes: PropertyType[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 操作符类型(直接复用 RxDB 定义)
|
|
32
|
+
*/
|
|
33
|
+
export type QueryBuilderOperator = OperatorName;
|
|
34
|
+
/**
|
|
35
|
+
* 默认操作符定义列表
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_OPERATORS: OperatorDefinition[];
|
|
38
|
+
/**
|
|
39
|
+
* 根据字段类型获取适用的操作符
|
|
40
|
+
*/
|
|
41
|
+
export declare function getOperatorsForType(type: PropertyType, operators?: OperatorDefinition[]): OperatorDefinition[];
|
|
42
|
+
//# sourceMappingURL=operator.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.interface.d.ts","sourceRoot":"","sources":["../../src/models/operator.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,GAAG,EAAE,YAAY,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;;OAOG;IACH,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IAE9D;;OAEG;IACH,eAAe,EAAE,YAAY,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,EAsIjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,SAAS,GAAE,kBAAkB,EAAsB,GAClD,kBAAkB,EAAE,CAEtB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { OperatorName, Rule, RuleGroup } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
/**
|
|
3
|
+
* UI 规则(宽松类型,用于查询构建器组件内部)
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* 由于 Rule<T> 是联合类型,在 UI 组件中难以处理部分更新。
|
|
7
|
+
* 此类型提供宽松的字段类型,方便 UI 组件操作。
|
|
8
|
+
*/
|
|
9
|
+
export interface UIRule {
|
|
10
|
+
id: string;
|
|
11
|
+
field: string;
|
|
12
|
+
operator: string;
|
|
13
|
+
value?: unknown;
|
|
14
|
+
/**
|
|
15
|
+
* EXISTS/NOT EXISTS 操作符的子查询条件
|
|
16
|
+
*/
|
|
17
|
+
where?: QueryBuilderRuleGroup<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 查询规则(复用 RxDB Rule 类型 + UI 元数据)
|
|
21
|
+
*
|
|
22
|
+
* @template T - 实体类型
|
|
23
|
+
* @template K - 字段键类型(自动推断)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* interface User {
|
|
28
|
+
* name: string;
|
|
29
|
+
* age: number;
|
|
30
|
+
* active: boolean;
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* const rule: QueryBuilderRule<User> = {
|
|
34
|
+
* id: 'rule-1',
|
|
35
|
+
* field: 'name', // ✅ 类型安全:只能是 'name' | 'age' | 'active'
|
|
36
|
+
* operator: 'contains',
|
|
37
|
+
* value: 'John' // ✅ 类型推断为 string
|
|
38
|
+
* };
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export type QueryBuilderRule<T = Record<string, unknown>> = Rule<T> & {
|
|
42
|
+
/**
|
|
43
|
+
* 规则唯一标识符
|
|
44
|
+
* 用于 React key, Angular trackBy, Vue :key
|
|
45
|
+
*/
|
|
46
|
+
id: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 规则组(复用 RxDB RuleGroup 类型 + UI 元数据)
|
|
50
|
+
*
|
|
51
|
+
* @template T - 实体类型
|
|
52
|
+
*/
|
|
53
|
+
export interface QueryBuilderRuleGroup<T = Record<string, unknown>> {
|
|
54
|
+
/**
|
|
55
|
+
* 规则组唯一标识符
|
|
56
|
+
*/
|
|
57
|
+
id: string;
|
|
58
|
+
/**
|
|
59
|
+
* 逻辑组合符
|
|
60
|
+
*/
|
|
61
|
+
combinator: 'and' | 'or';
|
|
62
|
+
/**
|
|
63
|
+
* 子规则列表(支持嵌套)
|
|
64
|
+
*/
|
|
65
|
+
rules: Array<QueryBuilderRule<T> | QueryBuilderRuleGroup<T>>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 查询构建器状态(简化版本,只包含必要字段)
|
|
69
|
+
*/
|
|
70
|
+
export interface QueryBuilderState<T = Record<string, unknown>> {
|
|
71
|
+
/**
|
|
72
|
+
* 根规则组
|
|
73
|
+
*/
|
|
74
|
+
rootGroup: QueryBuilderRuleGroup<T>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Schema 信息
|
|
78
|
+
*/
|
|
79
|
+
export interface SchemaInfo {
|
|
80
|
+
/**
|
|
81
|
+
* 实体名称
|
|
82
|
+
*/
|
|
83
|
+
entityName: string;
|
|
84
|
+
/**
|
|
85
|
+
* 字段列表
|
|
86
|
+
*/
|
|
87
|
+
fields: FieldMetadata[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 字段元数据
|
|
91
|
+
*/
|
|
92
|
+
export interface FieldMetadata {
|
|
93
|
+
/**
|
|
94
|
+
* 字段名称
|
|
95
|
+
*/
|
|
96
|
+
name: string;
|
|
97
|
+
/**
|
|
98
|
+
* 显示名称
|
|
99
|
+
*/
|
|
100
|
+
displayName: string;
|
|
101
|
+
/**
|
|
102
|
+
* 字段类型
|
|
103
|
+
*/
|
|
104
|
+
type: PropertyType;
|
|
105
|
+
/**
|
|
106
|
+
* 字段描述
|
|
107
|
+
*/
|
|
108
|
+
description?: string;
|
|
109
|
+
/**
|
|
110
|
+
* 是否必填
|
|
111
|
+
*/
|
|
112
|
+
required?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* 是否可空
|
|
115
|
+
*/
|
|
116
|
+
nullable?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* 枚举值(如果适用)
|
|
119
|
+
*/
|
|
120
|
+
enum?: unknown[];
|
|
121
|
+
/**
|
|
122
|
+
* 正则验证(字符串类型)
|
|
123
|
+
*/
|
|
124
|
+
pattern?: string;
|
|
125
|
+
/**
|
|
126
|
+
* 是否是关系字段
|
|
127
|
+
*/
|
|
128
|
+
isRelation?: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* 关系目标实体名称
|
|
131
|
+
*/
|
|
132
|
+
relationTarget?: string;
|
|
133
|
+
/**
|
|
134
|
+
* 关系类型(1:1, 1:m, m:1, m:n)
|
|
135
|
+
*/
|
|
136
|
+
relationKind?: '1:1' | '1:m' | 'm:1' | 'm:n';
|
|
137
|
+
/**
|
|
138
|
+
* 关系目标实体的字段列表(用于 EXISTS 子查询)
|
|
139
|
+
*/
|
|
140
|
+
relationFields?: FieldMetadata[];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 属性类型
|
|
144
|
+
*/
|
|
145
|
+
export type PropertyType = 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object' | 'relation';
|
|
146
|
+
/**
|
|
147
|
+
* 类型守卫:判断是否为规则组
|
|
148
|
+
*/
|
|
149
|
+
export declare function isRuleGroup<T>(item: QueryBuilderRule<T> | QueryBuilderRuleGroup<T>): item is QueryBuilderRuleGroup<T>;
|
|
150
|
+
/**
|
|
151
|
+
* 类型守卫:判断是否为规则
|
|
152
|
+
*/
|
|
153
|
+
export declare function isRule<T>(item: QueryBuilderRule<T> | QueryBuilderRuleGroup<T>): item is QueryBuilderRule<T>;
|
|
154
|
+
export type { OperatorName, Rule, RuleGroup };
|
|
155
|
+
//# sourceMappingURL=query-builder-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder-state.d.ts","sourceRoot":"","sources":["../../src/models/query-builder-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG;IACpE;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAChE;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D;;OAEG;IACH,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,IAAI,EAAE,YAAY,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAE7C;;OAEG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEtG;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAErH;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE3G;AAED,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { OperatorName } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { PropertyType } from './query-builder-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* 验证规则
|
|
5
|
+
*/
|
|
6
|
+
export interface ValidationRule {
|
|
7
|
+
/**
|
|
8
|
+
* 规则名称
|
|
9
|
+
*/
|
|
10
|
+
name: string;
|
|
11
|
+
/**
|
|
12
|
+
* 适用的字段类型(可选,undefined 表示适用于所有类型)
|
|
13
|
+
*/
|
|
14
|
+
appliesTo?: PropertyType[];
|
|
15
|
+
/**
|
|
16
|
+
* 错误消息
|
|
17
|
+
*/
|
|
18
|
+
message: string;
|
|
19
|
+
/**
|
|
20
|
+
* 验证函数
|
|
21
|
+
* @returns true 表示通过,false 表示失败
|
|
22
|
+
*/
|
|
23
|
+
validate: (context: ValidationContext) => boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 验证上下文
|
|
27
|
+
*/
|
|
28
|
+
export interface ValidationContext {
|
|
29
|
+
/**
|
|
30
|
+
* 字段类型
|
|
31
|
+
*/
|
|
32
|
+
fieldType: PropertyType;
|
|
33
|
+
/**
|
|
34
|
+
* 操作符
|
|
35
|
+
*/
|
|
36
|
+
operator: OperatorName;
|
|
37
|
+
/**
|
|
38
|
+
* 当前值
|
|
39
|
+
*/
|
|
40
|
+
value: unknown;
|
|
41
|
+
/**
|
|
42
|
+
* 是否必填
|
|
43
|
+
*/
|
|
44
|
+
required?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* 枚举值
|
|
47
|
+
*/
|
|
48
|
+
enum?: unknown[];
|
|
49
|
+
/**
|
|
50
|
+
* 正则验证
|
|
51
|
+
*/
|
|
52
|
+
pattern?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 验证错误项
|
|
56
|
+
*/
|
|
57
|
+
export interface ValidationError {
|
|
58
|
+
/**
|
|
59
|
+
* 字段名
|
|
60
|
+
*/
|
|
61
|
+
field: string;
|
|
62
|
+
/**
|
|
63
|
+
* 规则名
|
|
64
|
+
*/
|
|
65
|
+
rule: string;
|
|
66
|
+
/**
|
|
67
|
+
* 错误消息
|
|
68
|
+
*/
|
|
69
|
+
message: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 验证结果
|
|
73
|
+
*/
|
|
74
|
+
export interface ValidationResult {
|
|
75
|
+
/**
|
|
76
|
+
* 是否有效
|
|
77
|
+
*/
|
|
78
|
+
valid: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* 错误列表
|
|
81
|
+
*/
|
|
82
|
+
errors?: ValidationError[];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 内置验证规则
|
|
86
|
+
*/
|
|
87
|
+
export declare const BUILTIN_VALIDATION_RULES: ValidationRule[];
|
|
88
|
+
//# sourceMappingURL=validation.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.interface.d.ts","sourceRoot":"","sources":["../../src/models/validation.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAE3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,EAAE,YAAY,CAAC;IAExB;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IAEvB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,cAAc,EAoEpD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Services 导出
|
|
3
|
+
*/
|
|
4
|
+
export * from './operator-registry.service.js';
|
|
5
|
+
export * from './query-builder.service.js';
|
|
6
|
+
export * from './query-converter.service.js';
|
|
7
|
+
export * from './schema-parser.service.js';
|
|
8
|
+
export * from './validation.service.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { OperatorName } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { OperatorDefinition } from '../models/operator.interface.js';
|
|
3
|
+
import { FieldMetadata, PropertyType } from '../models/query-builder-state.js';
|
|
4
|
+
/**
|
|
5
|
+
* 操作符注册表选项
|
|
6
|
+
*/
|
|
7
|
+
export interface OperatorRegistryOptions {
|
|
8
|
+
/**
|
|
9
|
+
* 初始操作符集合
|
|
10
|
+
* @default DEFAULT_OPERATORS
|
|
11
|
+
*/
|
|
12
|
+
operators?: OperatorDefinition[];
|
|
13
|
+
/**
|
|
14
|
+
* 是否使用默认操作符作为基础
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
useDefaultOperators?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 操作符注册表服务
|
|
21
|
+
* 管理可用操作符及其元数据
|
|
22
|
+
*/
|
|
23
|
+
export declare class OperatorRegistry {
|
|
24
|
+
private readonly operators;
|
|
25
|
+
/**
|
|
26
|
+
* 获取操作符数量
|
|
27
|
+
*/
|
|
28
|
+
get size(): number;
|
|
29
|
+
constructor(options?: OperatorRegistryOptions);
|
|
30
|
+
/**
|
|
31
|
+
* 注册新操作符
|
|
32
|
+
*
|
|
33
|
+
* @param operator - 操作符定义
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* registry.register({
|
|
38
|
+
* key: 'contains',
|
|
39
|
+
* label: '包含',
|
|
40
|
+
* applicableTypes: ['string'],
|
|
41
|
+
* valueType: 'single'
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
register(operator: OperatorDefinition): void;
|
|
46
|
+
/**
|
|
47
|
+
* 批量注册操作符
|
|
48
|
+
*
|
|
49
|
+
* @param operators - 操作符定义数组
|
|
50
|
+
*/
|
|
51
|
+
registerMany(operators: OperatorDefinition[]): void;
|
|
52
|
+
/**
|
|
53
|
+
* 移除操作符
|
|
54
|
+
*
|
|
55
|
+
* @param key - 操作符键值
|
|
56
|
+
* @returns 是否成功移除
|
|
57
|
+
*/
|
|
58
|
+
unregister(key: OperatorName): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* 获取操作符定义
|
|
61
|
+
*
|
|
62
|
+
* @param key - 操作符键值
|
|
63
|
+
* @returns 操作符定义或 undefined
|
|
64
|
+
*/
|
|
65
|
+
get(key: OperatorName): OperatorDefinition | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* 获取所有操作符
|
|
68
|
+
*
|
|
69
|
+
* @returns 所有操作符定义数组
|
|
70
|
+
*/
|
|
71
|
+
getAll(): OperatorDefinition[];
|
|
72
|
+
/**
|
|
73
|
+
* 根据字段类型获取适用的操作符
|
|
74
|
+
*
|
|
75
|
+
* @param fieldType - 字段类型
|
|
76
|
+
* @returns 适用的操作符数组
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const stringOperators = registry.getForType('string');
|
|
81
|
+
* // [{ key: '=', ... }, { key: 'contains', ... }, ...]
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
getForType(fieldType: PropertyType): OperatorDefinition[];
|
|
85
|
+
/**
|
|
86
|
+
* 根据字段元数据获取适用的操作符
|
|
87
|
+
*
|
|
88
|
+
* @param field - 字段元数据
|
|
89
|
+
* @returns 适用的操作符数组
|
|
90
|
+
*/
|
|
91
|
+
getForField(field: FieldMetadata): OperatorDefinition[];
|
|
92
|
+
/**
|
|
93
|
+
* 检查操作符是否支持指定类型
|
|
94
|
+
*
|
|
95
|
+
* @param operatorKey - 操作符键值
|
|
96
|
+
* @param fieldType - 字段类型
|
|
97
|
+
* @returns 是否支持
|
|
98
|
+
*/
|
|
99
|
+
isOperatorSupportedForType(operatorKey: OperatorName, fieldType: PropertyType): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* 检查操作符是否支持指定字段
|
|
102
|
+
*
|
|
103
|
+
* @param operatorKey - 操作符键值
|
|
104
|
+
* @param field - 字段元数据
|
|
105
|
+
* @returns 是否支持
|
|
106
|
+
*/
|
|
107
|
+
isOperatorSupportedForField(operatorKey: OperatorName, field: FieldMetadata): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* 获取操作符的值类型
|
|
110
|
+
*
|
|
111
|
+
* @param operatorKey - 操作符键值
|
|
112
|
+
* @returns 值类型
|
|
113
|
+
*/
|
|
114
|
+
getValueType(operatorKey: OperatorName): OperatorDefinition['valueType'] | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* 清空所有操作符
|
|
117
|
+
*/
|
|
118
|
+
clear(): void;
|
|
119
|
+
/**
|
|
120
|
+
* 重置为默认操作符
|
|
121
|
+
*/
|
|
122
|
+
reset(): void;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 创建 OperatorRegistry 实例的工厂函数
|
|
126
|
+
*/
|
|
127
|
+
export declare function createOperatorRegistry(options?: OperatorRegistryOptions): OperatorRegistry;
|
|
128
|
+
/**
|
|
129
|
+
* 获取默认操作符注册表
|
|
130
|
+
*/
|
|
131
|
+
export declare function getDefaultOperatorRegistry(): OperatorRegistry;
|
|
132
|
+
//# sourceMappingURL=operator-registry.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-registry.service.d.ts","sourceRoot":"","sources":["../../src/services/operator-registry.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEpF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAEjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAElE;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;gBAEW,OAAO,GAAE,uBAA4B;IAkBjD;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI5C;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAMnD;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO;IAItC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,GAAG,SAAS;IAItD;;;;OAIG;IACH,MAAM,IAAI,kBAAkB,EAAE;IAI9B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,kBAAkB,EAAE;IAIzD;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,kBAAkB,EAAE;IAyBvD;;;;;;OAMG;IACH,0BAA0B,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,OAAO;IAKvF;;;;;;OAMG;IACH,2BAA2B,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO;IAarF;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS;IAKpF;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAE1F;AAOD;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAK7D"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { RuleGroup } from '../../packages/rxdb/src/index.ts';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { QueryBuilderConfig } from '../models/config.interface.js';
|
|
4
|
+
import { FieldMetadata, QueryBuilderRule, QueryBuilderRuleGroup, QueryBuilderState } from '../models/query-builder-state.js';
|
|
5
|
+
import { ValidationResult } from '../models/validation.interface.js';
|
|
6
|
+
import { OperatorRegistry } from './operator-registry.service.js';
|
|
7
|
+
import { QueryConverter } from './query-converter.service.js';
|
|
8
|
+
import { ValidationService } from './validation.service.js';
|
|
9
|
+
/**
|
|
10
|
+
* QueryBuilderService 选项
|
|
11
|
+
*/
|
|
12
|
+
export interface QueryBuilderServiceOptions<T = Record<string, unknown>> {
|
|
13
|
+
/**
|
|
14
|
+
* 初始查询状态
|
|
15
|
+
*/
|
|
16
|
+
initialState?: QueryBuilderState<T>;
|
|
17
|
+
/**
|
|
18
|
+
* 初始 RxDB Query
|
|
19
|
+
*/
|
|
20
|
+
initialQuery?: RuleGroup<T>;
|
|
21
|
+
/**
|
|
22
|
+
* 字段元数据
|
|
23
|
+
*/
|
|
24
|
+
fields?: FieldMetadata[];
|
|
25
|
+
/**
|
|
26
|
+
* 配置选项
|
|
27
|
+
*/
|
|
28
|
+
config?: QueryBuilderConfig<T>;
|
|
29
|
+
/**
|
|
30
|
+
* 自定义操作符注册表
|
|
31
|
+
*/
|
|
32
|
+
operatorRegistry?: OperatorRegistry;
|
|
33
|
+
/**
|
|
34
|
+
* 自定义校验服务
|
|
35
|
+
*/
|
|
36
|
+
validationService?: ValidationService;
|
|
37
|
+
/**
|
|
38
|
+
* 自定义转换器
|
|
39
|
+
*/
|
|
40
|
+
queryConverter?: QueryConverter<T>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* QueryBuilder 核心服务
|
|
44
|
+
* 基于 RxJS 的响应式状态管理
|
|
45
|
+
*/
|
|
46
|
+
export declare class QueryBuilderService<T = Record<string, unknown>> {
|
|
47
|
+
private readonly stateSubject;
|
|
48
|
+
private readonly fieldsMap;
|
|
49
|
+
private readonly config;
|
|
50
|
+
private readonly operatorRegistry;
|
|
51
|
+
private readonly validationService;
|
|
52
|
+
private readonly queryConverter;
|
|
53
|
+
/**
|
|
54
|
+
* 状态变更的 Observable 流
|
|
55
|
+
*/
|
|
56
|
+
readonly state$: Observable<QueryBuilderState<T>>;
|
|
57
|
+
/**
|
|
58
|
+
* 根规则组的 Observable
|
|
59
|
+
*/
|
|
60
|
+
readonly rootGroup$: Observable<QueryBuilderRuleGroup<T>>;
|
|
61
|
+
/**
|
|
62
|
+
* 校验结果的 Observable
|
|
63
|
+
*/
|
|
64
|
+
readonly validation$: Observable<ValidationResult>;
|
|
65
|
+
/**
|
|
66
|
+
* RxDB Query 格式的 Observable
|
|
67
|
+
*/
|
|
68
|
+
readonly query$: Observable<RuleGroup<T>>;
|
|
69
|
+
constructor(options?: QueryBuilderServiceOptions<T>);
|
|
70
|
+
/**
|
|
71
|
+
* 获取当前状态快照
|
|
72
|
+
*/
|
|
73
|
+
getState(): QueryBuilderState<T>;
|
|
74
|
+
/**
|
|
75
|
+
* 获取当前配置
|
|
76
|
+
*/
|
|
77
|
+
getConfig(): QueryBuilderConfig<T>;
|
|
78
|
+
/**
|
|
79
|
+
* 获取最大嵌套层级
|
|
80
|
+
*/
|
|
81
|
+
getMaxNestingLevel(): number;
|
|
82
|
+
/**
|
|
83
|
+
* 获取字段列表
|
|
84
|
+
*/
|
|
85
|
+
getFields(): FieldMetadata[];
|
|
86
|
+
/**
|
|
87
|
+
* 设置字段列表
|
|
88
|
+
*/
|
|
89
|
+
setFields(fields: FieldMetadata[]): void;
|
|
90
|
+
/**
|
|
91
|
+
* 获取操作符注册表
|
|
92
|
+
*/
|
|
93
|
+
getOperatorRegistry(): OperatorRegistry;
|
|
94
|
+
/**
|
|
95
|
+
* 添加规则
|
|
96
|
+
*/
|
|
97
|
+
addRule(parentGroupId?: string | null, rule?: Partial<Omit<QueryBuilderRule<T>, 'id'>>): string;
|
|
98
|
+
/**
|
|
99
|
+
* 添加规则组
|
|
100
|
+
*/
|
|
101
|
+
addGroup(parentGroupId?: string | null, combinator?: 'and' | 'or'): string;
|
|
102
|
+
/**
|
|
103
|
+
* 更新规则
|
|
104
|
+
*/
|
|
105
|
+
updateRule(ruleId: string, updates: Partial<Omit<QueryBuilderRule<T>, 'id'>>): void;
|
|
106
|
+
/**
|
|
107
|
+
* 更新组的组合器
|
|
108
|
+
*/
|
|
109
|
+
updateGroupCombinator(groupId: string, combinator: 'and' | 'or'): void;
|
|
110
|
+
/**
|
|
111
|
+
* 删除规则或组
|
|
112
|
+
*/
|
|
113
|
+
remove(itemId: string): void;
|
|
114
|
+
/**
|
|
115
|
+
* 清空所有规则
|
|
116
|
+
*/
|
|
117
|
+
clear(): void;
|
|
118
|
+
/**
|
|
119
|
+
* 销毁服务
|
|
120
|
+
*/
|
|
121
|
+
destroy(): void;
|
|
122
|
+
/**
|
|
123
|
+
* 获取 RxDB Query 格式
|
|
124
|
+
*/
|
|
125
|
+
toRxDBQuery(): RuleGroup<T>;
|
|
126
|
+
/**
|
|
127
|
+
* 从 RxDB Query 加载
|
|
128
|
+
*/
|
|
129
|
+
fromRxDBQuery(query: RuleGroup<T>): void;
|
|
130
|
+
/**
|
|
131
|
+
* 执行校验并返回结果
|
|
132
|
+
*/
|
|
133
|
+
validate(): ValidationResult;
|
|
134
|
+
/**
|
|
135
|
+
* 检查当前状态是否有效
|
|
136
|
+
*/
|
|
137
|
+
isValid(): boolean;
|
|
138
|
+
private addItemToGroup;
|
|
139
|
+
private updateItemInGroup;
|
|
140
|
+
private removeItemFromGroup;
|
|
141
|
+
private getGroupDepth;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 创建 QueryBuilderService 实例的工厂函数
|
|
145
|
+
*/
|
|
146
|
+
export declare function createQueryBuilderService<T = Record<string, unknown>>(options?: QueryBuilderServiceOptions<T>): QueryBuilderService<T>;
|
|
147
|
+
//# sourceMappingURL=query-builder.service.d.ts.map
|