qast 1.2.0 → 2.0.2
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 +22 -22
- package/README.md +775 -520
- package/README.zh-CN.md +520 -0
- package/dist/adapters/drizzle.d.ts +66 -0
- package/dist/adapters/drizzle.d.ts.map +1 -0
- package/dist/adapters/drizzle.js +222 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/knex.d.ts +22 -0
- package/dist/adapters/knex.d.ts.map +1 -0
- package/dist/adapters/knex.js +158 -0
- package/dist/adapters/knex.js.map +1 -0
- package/dist/adapters/mongoose.d.ts +15 -0
- package/dist/adapters/mongoose.d.ts.map +1 -0
- package/dist/adapters/mongoose.js +153 -0
- package/dist/adapters/mongoose.js.map +1 -0
- package/dist/adapters/prisma.d.ts +5 -2
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +102 -4
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/sequelize.d.ts +26 -8
- package/dist/adapters/sequelize.d.ts.map +1 -1
- package/dist/adapters/sequelize.js +168 -7
- package/dist/adapters/sequelize.js.map +1 -1
- package/dist/adapters/typeorm.d.ts +32 -2
- package/dist/adapters/typeorm.d.ts.map +1 -1
- package/dist/adapters/typeorm.js +169 -3
- package/dist/adapters/typeorm.js.map +1 -1
- package/dist/builder/query-builder.d.ts +139 -0
- package/dist/builder/query-builder.d.ts.map +1 -0
- package/dist/builder/query-builder.js +320 -0
- package/dist/builder/query-builder.js.map +1 -0
- package/dist/errors.d.ts +18 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +130 -10
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +77 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +124 -16
- package/dist/index.js.map +1 -1
- package/dist/integrations/express.d.ts +14 -0
- package/dist/integrations/express.d.ts.map +1 -0
- package/dist/integrations/express.js +33 -0
- package/dist/integrations/express.js.map +1 -0
- package/dist/integrations/fastify.d.ts +17 -0
- package/dist/integrations/fastify.d.ts.map +1 -0
- package/dist/integrations/fastify.js +35 -0
- package/dist/integrations/fastify.js.map +1 -0
- package/dist/integrations/hono.d.ts +14 -0
- package/dist/integrations/hono.d.ts.map +1 -0
- package/dist/integrations/hono.js +30 -0
- package/dist/integrations/hono.js.map +1 -0
- package/dist/integrations/nestjs.d.ts +23 -0
- package/dist/integrations/nestjs.d.ts.map +1 -0
- package/dist/integrations/nestjs.js +137 -0
- package/dist/integrations/nestjs.js.map +1 -0
- package/dist/parser/parser.d.ts +15 -7
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +117 -15
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.d.ts +11 -1
- package/dist/parser/tokenizer.d.ts.map +1 -1
- package/dist/parser/tokenizer.js +67 -10
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/validator.d.ts +39 -0
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +144 -3
- package/dist/parser/validator.js.map +1 -1
- package/dist/types/ast.d.ts +59 -3
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/types/ast.js +21 -0
- package/dist/types/ast.js.map +1 -1
- package/dist/utils/ast-utils.d.ts +43 -0
- package/dist/utils/ast-utils.d.ts.map +1 -0
- package/dist/utils/ast-utils.js +205 -0
- package/dist/utils/ast-utils.js.map +1 -0
- package/dist/utils/cache.d.ts +47 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +132 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/serializer.d.ts +6 -0
- package/dist/utils/serializer.d.ts.map +1 -0
- package/dist/utils/serializer.js +140 -0
- package/dist/utils/serializer.js.map +1 -0
- package/package.json +124 -84
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toDrizzleFilter = toDrizzleFilter;
|
|
4
|
+
exports.transformDrizzleConditions = transformDrizzleConditions;
|
|
5
|
+
const ast_1 = require("../types/ast");
|
|
6
|
+
/**
|
|
7
|
+
* Transform a QAST AST node to a Drizzle filter
|
|
8
|
+
*
|
|
9
|
+
* Note: Drizzle uses SQL conditions from 'drizzle-orm' package.
|
|
10
|
+
* This adapter returns a structure that can be used with Drizzle's query builder.
|
|
11
|
+
*
|
|
12
|
+
* Example usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { and, or, eq, gt, like } from 'drizzle-orm';
|
|
15
|
+
* import { toDrizzleFilter } from 'qast';
|
|
16
|
+
*
|
|
17
|
+
* const filter = toDrizzleFilter(ast);
|
|
18
|
+
* // Use filter.where with Drizzle query builder
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function toDrizzleFilter(ast) {
|
|
22
|
+
let filter;
|
|
23
|
+
let orderBy;
|
|
24
|
+
let limit;
|
|
25
|
+
let offset;
|
|
26
|
+
if ('filter' in ast) {
|
|
27
|
+
filter = ast.filter;
|
|
28
|
+
orderBy = ast.orderBy;
|
|
29
|
+
limit = ast.limit;
|
|
30
|
+
offset = ast.offset;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
filter = ast;
|
|
34
|
+
}
|
|
35
|
+
const result = {
|
|
36
|
+
where: transformNode(filter),
|
|
37
|
+
};
|
|
38
|
+
if (orderBy && orderBy.length > 0) {
|
|
39
|
+
// Note: Drizzle orderBy requires column references, not strings
|
|
40
|
+
// This is a simplified version - users may need to map field names to columns
|
|
41
|
+
result.orderBy = orderBy.map(clause => ({
|
|
42
|
+
column: clause.field, // Users should replace with actual column references
|
|
43
|
+
direction: clause.direction,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
if (limit !== undefined) {
|
|
47
|
+
result.limit = limit;
|
|
48
|
+
}
|
|
49
|
+
if (offset !== undefined) {
|
|
50
|
+
result.offset = offset;
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Transform a node to Drizzle format
|
|
56
|
+
*
|
|
57
|
+
* Note: This returns a structure with metadata that users need to transform
|
|
58
|
+
* using Drizzle's SQL condition functions (eq, gt, and, or, etc.)
|
|
59
|
+
*/
|
|
60
|
+
function transformNode(node) {
|
|
61
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
62
|
+
return transformComparisonNode(node);
|
|
63
|
+
}
|
|
64
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
65
|
+
return transformLogicalNode(node);
|
|
66
|
+
}
|
|
67
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
68
|
+
return transformNotNode(node);
|
|
69
|
+
}
|
|
70
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
71
|
+
return transformBetweenNode(node);
|
|
72
|
+
}
|
|
73
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
74
|
+
return transformNullCheckNode(node);
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`Invalid node type: ${node.type}`);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Transform a comparison node to Drizzle format
|
|
80
|
+
*/
|
|
81
|
+
function transformComparisonNode(node) {
|
|
82
|
+
const { field, op, value } = node;
|
|
83
|
+
// Return metadata structure that users can transform with Drizzle functions
|
|
84
|
+
return {
|
|
85
|
+
__qast_type__: 'comparison',
|
|
86
|
+
field,
|
|
87
|
+
operator: op,
|
|
88
|
+
value,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Transform a logical node to Drizzle format
|
|
93
|
+
*/
|
|
94
|
+
function transformLogicalNode(node) {
|
|
95
|
+
const left = transformNode(node.left);
|
|
96
|
+
const right = transformNode(node.right);
|
|
97
|
+
return {
|
|
98
|
+
__qast_type__: 'logical',
|
|
99
|
+
operator: node.type.toLowerCase(),
|
|
100
|
+
left,
|
|
101
|
+
right,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Transform a NOT node to Drizzle format
|
|
106
|
+
*/
|
|
107
|
+
function transformNotNode(node) {
|
|
108
|
+
return {
|
|
109
|
+
__qast_type__: 'not',
|
|
110
|
+
operand: transformNode(node.operand),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Transform a BETWEEN node to Drizzle format
|
|
115
|
+
*/
|
|
116
|
+
function transformBetweenNode(node) {
|
|
117
|
+
return {
|
|
118
|
+
__qast_type__: 'between',
|
|
119
|
+
field: node.field,
|
|
120
|
+
min: node.min,
|
|
121
|
+
max: node.max,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Transform a NULL_CHECK node to Drizzle format
|
|
126
|
+
*/
|
|
127
|
+
function transformNullCheckNode(node) {
|
|
128
|
+
return {
|
|
129
|
+
__qast_type__: 'null_check',
|
|
130
|
+
field: node.field,
|
|
131
|
+
isNull: node.isNull,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Helper function to transform Drizzle metadata to actual Drizzle conditions
|
|
136
|
+
* This requires Drizzle to be installed and SQL functions to be imported.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* import { and, or, eq, gt, like, isNull, isNotNull, between } from 'drizzle-orm';
|
|
141
|
+
* import { toDrizzleFilter, transformDrizzleConditions } from 'qast';
|
|
142
|
+
*
|
|
143
|
+
* const filter = toDrizzleFilter(ast);
|
|
144
|
+
* const transformed = transformDrizzleConditions(filter.where, {
|
|
145
|
+
* eq, gt, like, and, or, isNull, isNotNull, between
|
|
146
|
+
* }, columnMap); // columnMap maps field names to Drizzle column references
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
function transformDrizzleConditions(condition, sql, columnMap) {
|
|
150
|
+
if (!condition || typeof condition !== 'object') {
|
|
151
|
+
return condition;
|
|
152
|
+
}
|
|
153
|
+
if (condition.__qast_type__ === 'comparison') {
|
|
154
|
+
const column = columnMap[condition.field];
|
|
155
|
+
if (!column) {
|
|
156
|
+
throw new Error(`Column not found for field: ${condition.field}`);
|
|
157
|
+
}
|
|
158
|
+
switch (condition.operator) {
|
|
159
|
+
case 'eq':
|
|
160
|
+
return sql.eq ? sql.eq(column, condition.value) : condition;
|
|
161
|
+
case 'ne':
|
|
162
|
+
return sql.ne ? sql.ne(column, condition.value) : condition;
|
|
163
|
+
case 'gt':
|
|
164
|
+
return sql.gt ? sql.gt(column, condition.value) : condition;
|
|
165
|
+
case 'lt':
|
|
166
|
+
return sql.lt ? sql.lt(column, condition.value) : condition;
|
|
167
|
+
case 'gte':
|
|
168
|
+
return sql.gte ? sql.gte(column, condition.value) : condition;
|
|
169
|
+
case 'lte':
|
|
170
|
+
return sql.lte ? sql.lte(column, condition.value) : condition;
|
|
171
|
+
case 'in':
|
|
172
|
+
return sql.in ? sql.in(column, condition.value) : condition;
|
|
173
|
+
case 'notIn':
|
|
174
|
+
return sql.notIn ? sql.notIn(column, condition.value) : condition;
|
|
175
|
+
case 'contains':
|
|
176
|
+
return sql.like ? sql.like(column, `%${condition.value}%`) : condition;
|
|
177
|
+
case 'startsWith':
|
|
178
|
+
return sql.like ? sql.like(column, `${condition.value}%`) : condition;
|
|
179
|
+
case 'endsWith':
|
|
180
|
+
return sql.like ? sql.like(column, `%${condition.value}`) : condition;
|
|
181
|
+
case 'like':
|
|
182
|
+
return sql.like ? sql.like(column, condition.value) : condition;
|
|
183
|
+
default:
|
|
184
|
+
return condition;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (condition.__qast_type__ === 'logical') {
|
|
188
|
+
const left = transformDrizzleConditions(condition.left, sql, columnMap);
|
|
189
|
+
const right = transformDrizzleConditions(condition.right, sql, columnMap);
|
|
190
|
+
if (condition.operator === 'and') {
|
|
191
|
+
return sql.and ? sql.and(left, right) : condition;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
return sql.or ? sql.or(left, right) : condition;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (condition.__qast_type__ === 'not') {
|
|
198
|
+
const operand = transformDrizzleConditions(condition.operand, sql, columnMap);
|
|
199
|
+
return sql.not ? sql.not(operand) : condition;
|
|
200
|
+
}
|
|
201
|
+
if (condition.__qast_type__ === 'between') {
|
|
202
|
+
const column = columnMap[condition.field];
|
|
203
|
+
if (!column) {
|
|
204
|
+
throw new Error(`Column not found for field: ${condition.field}`);
|
|
205
|
+
}
|
|
206
|
+
return sql.between ? sql.between(column, condition.min, condition.max) : condition;
|
|
207
|
+
}
|
|
208
|
+
if (condition.__qast_type__ === 'null_check') {
|
|
209
|
+
const column = columnMap[condition.field];
|
|
210
|
+
if (!column) {
|
|
211
|
+
throw new Error(`Column not found for field: ${condition.field}`);
|
|
212
|
+
}
|
|
213
|
+
if (condition.isNull) {
|
|
214
|
+
return sql.isNull ? sql.isNull(column) : condition;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
return sql.isNotNull ? sql.isNotNull(column) : condition;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return condition;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/adapters/drizzle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Knex query builder callback type
|
|
4
|
+
*/
|
|
5
|
+
export type KnexQueryCallback = (queryBuilder: any) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Knex filter result
|
|
8
|
+
*/
|
|
9
|
+
export interface KnexFilter {
|
|
10
|
+
whereCallback: KnexQueryCallback;
|
|
11
|
+
orderBy?: Array<{
|
|
12
|
+
column: string;
|
|
13
|
+
order: 'asc' | 'desc';
|
|
14
|
+
}>;
|
|
15
|
+
limit?: number;
|
|
16
|
+
offset?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Transform a QAST AST node to a Knex query builder callback
|
|
20
|
+
*/
|
|
21
|
+
export declare function toKnexFilter(ast: QastNode | QueryAST): KnexFilter;
|
|
22
|
+
//# sourceMappingURL=knex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/adapters/knex.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAMT,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAuCjE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toKnexFilter = toKnexFilter;
|
|
4
|
+
const ast_1 = require("../types/ast");
|
|
5
|
+
/**
|
|
6
|
+
* Transform a QAST AST node to a Knex query builder callback
|
|
7
|
+
*/
|
|
8
|
+
function toKnexFilter(ast) {
|
|
9
|
+
let filter;
|
|
10
|
+
let orderBy;
|
|
11
|
+
let limit;
|
|
12
|
+
let offset;
|
|
13
|
+
if ('filter' in ast) {
|
|
14
|
+
filter = ast.filter;
|
|
15
|
+
orderBy = ast.orderBy;
|
|
16
|
+
limit = ast.limit;
|
|
17
|
+
offset = ast.offset;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
filter = ast;
|
|
21
|
+
}
|
|
22
|
+
const whereCallback = (qb) => {
|
|
23
|
+
buildWhereClause(qb, filter);
|
|
24
|
+
};
|
|
25
|
+
const result = {
|
|
26
|
+
whereCallback,
|
|
27
|
+
};
|
|
28
|
+
if (orderBy && orderBy.length > 0) {
|
|
29
|
+
result.orderBy = orderBy.map(clause => ({
|
|
30
|
+
column: clause.field,
|
|
31
|
+
order: clause.direction,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
if (limit !== undefined) {
|
|
35
|
+
result.limit = limit;
|
|
36
|
+
}
|
|
37
|
+
if (offset !== undefined) {
|
|
38
|
+
result.offset = offset;
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build WHERE clause for Knex query builder
|
|
44
|
+
*/
|
|
45
|
+
function buildWhereClause(qb, node) {
|
|
46
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
47
|
+
buildComparisonClause(qb, node);
|
|
48
|
+
}
|
|
49
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
50
|
+
buildLogicalClause(qb, node);
|
|
51
|
+
}
|
|
52
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
53
|
+
buildNotClause(qb, node);
|
|
54
|
+
}
|
|
55
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
56
|
+
buildBetweenClause(qb, node);
|
|
57
|
+
}
|
|
58
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
59
|
+
buildNullCheckClause(qb, node);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build comparison clause
|
|
64
|
+
*/
|
|
65
|
+
function buildComparisonClause(qb, node) {
|
|
66
|
+
const { field, op, value } = node;
|
|
67
|
+
switch (op) {
|
|
68
|
+
case 'eq':
|
|
69
|
+
qb.where(field, value);
|
|
70
|
+
break;
|
|
71
|
+
case 'ne':
|
|
72
|
+
qb.whereNot(field, value);
|
|
73
|
+
break;
|
|
74
|
+
case 'gt':
|
|
75
|
+
qb.where(field, '>', value);
|
|
76
|
+
break;
|
|
77
|
+
case 'lt':
|
|
78
|
+
qb.where(field, '<', value);
|
|
79
|
+
break;
|
|
80
|
+
case 'gte':
|
|
81
|
+
qb.where(field, '>=', value);
|
|
82
|
+
break;
|
|
83
|
+
case 'lte':
|
|
84
|
+
qb.where(field, '<=', value);
|
|
85
|
+
break;
|
|
86
|
+
case 'in':
|
|
87
|
+
qb.whereIn(field, value);
|
|
88
|
+
break;
|
|
89
|
+
case 'notIn':
|
|
90
|
+
qb.whereNotIn(field, value);
|
|
91
|
+
break;
|
|
92
|
+
case 'contains':
|
|
93
|
+
qb.where(field, 'like', `%${value}%`);
|
|
94
|
+
break;
|
|
95
|
+
case 'startsWith':
|
|
96
|
+
qb.where(field, 'like', `${value}%`);
|
|
97
|
+
break;
|
|
98
|
+
case 'endsWith':
|
|
99
|
+
qb.where(field, 'like', `%${value}`);
|
|
100
|
+
break;
|
|
101
|
+
case 'like':
|
|
102
|
+
qb.where(field, 'like', value);
|
|
103
|
+
break;
|
|
104
|
+
case 'regex':
|
|
105
|
+
case 'matches':
|
|
106
|
+
// Knex supports regex for some databases
|
|
107
|
+
qb.where(field, '~', value);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
throw new Error(`Unsupported operator: ${op}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build logical clause
|
|
115
|
+
*/
|
|
116
|
+
function buildLogicalClause(qb, node) {
|
|
117
|
+
if (node.type === 'AND') {
|
|
118
|
+
qb.where((subQb) => {
|
|
119
|
+
buildWhereClause(subQb, node.left);
|
|
120
|
+
buildWhereClause(subQb, node.right);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
qb.where((subQb) => {
|
|
125
|
+
subQb.where((leftQb) => {
|
|
126
|
+
buildWhereClause(leftQb, node.left);
|
|
127
|
+
}).orWhere((rightQb) => {
|
|
128
|
+
buildWhereClause(rightQb, node.right);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Build NOT clause
|
|
135
|
+
*/
|
|
136
|
+
function buildNotClause(qb, node) {
|
|
137
|
+
qb.whereNot((subQb) => {
|
|
138
|
+
buildWhereClause(subQb, node.operand);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build BETWEEN clause
|
|
143
|
+
*/
|
|
144
|
+
function buildBetweenClause(qb, node) {
|
|
145
|
+
qb.whereBetween(node.field, [node.min, node.max]);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build NULL check clause
|
|
149
|
+
*/
|
|
150
|
+
function buildNullCheckClause(qb, node) {
|
|
151
|
+
if (node.isNull) {
|
|
152
|
+
qb.whereNull(node.field);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
qb.whereNotNull(node.field);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=knex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.js","sourceRoot":"","sources":["../../src/adapters/knex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Mongoose filter type
|
|
4
|
+
*/
|
|
5
|
+
export type MongooseFilter = {
|
|
6
|
+
filter: Record<string, any>;
|
|
7
|
+
sort?: Record<string, 1 | -1>;
|
|
8
|
+
limit?: number;
|
|
9
|
+
skip?: number;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Transform a QAST AST node to a Mongoose filter
|
|
13
|
+
*/
|
|
14
|
+
export declare function toMongooseFilter(ast: QastNode | QueryAST): MongooseFilter;
|
|
15
|
+
//# sourceMappingURL=mongoose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoose.d.ts","sourceRoot":"","sources":["../../src/adapters/mongoose.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAMT,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,CA8BzE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toMongooseFilter = toMongooseFilter;
|
|
4
|
+
const ast_1 = require("../types/ast");
|
|
5
|
+
/**
|
|
6
|
+
* Transform a QAST AST node to a Mongoose filter
|
|
7
|
+
*/
|
|
8
|
+
function toMongooseFilter(ast) {
|
|
9
|
+
if ('filter' in ast) {
|
|
10
|
+
// It's a QueryAST
|
|
11
|
+
const queryAST = ast;
|
|
12
|
+
const result = {
|
|
13
|
+
filter: transformNode(queryAST.filter),
|
|
14
|
+
};
|
|
15
|
+
if (queryAST.orderBy && queryAST.orderBy.length > 0) {
|
|
16
|
+
result.sort = {};
|
|
17
|
+
for (const clause of queryAST.orderBy) {
|
|
18
|
+
result.sort[clause.field] = clause.direction === 'asc' ? 1 : -1;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (queryAST.limit !== undefined) {
|
|
22
|
+
result.limit = queryAST.limit;
|
|
23
|
+
}
|
|
24
|
+
if (queryAST.offset !== undefined) {
|
|
25
|
+
result.skip = queryAST.offset;
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// It's just a QastNode (backward compatibility)
|
|
31
|
+
return {
|
|
32
|
+
filter: transformNode(ast),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Transform a node to Mongoose format
|
|
38
|
+
*/
|
|
39
|
+
function transformNode(node) {
|
|
40
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
41
|
+
return transformComparisonNode(node);
|
|
42
|
+
}
|
|
43
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
44
|
+
return transformLogicalNode(node);
|
|
45
|
+
}
|
|
46
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
47
|
+
return transformNotNode(node);
|
|
48
|
+
}
|
|
49
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
50
|
+
return transformBetweenNode(node);
|
|
51
|
+
}
|
|
52
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
53
|
+
return transformNullCheckNode(node);
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Invalid node type: ${node.type}`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Transform a comparison node to Mongoose format
|
|
59
|
+
*/
|
|
60
|
+
function transformComparisonNode(node) {
|
|
61
|
+
const { field, op, value } = node;
|
|
62
|
+
switch (op) {
|
|
63
|
+
case 'eq':
|
|
64
|
+
return { [field]: value };
|
|
65
|
+
case 'ne':
|
|
66
|
+
return { [field]: { $ne: value } };
|
|
67
|
+
case 'gt':
|
|
68
|
+
return { [field]: { $gt: value } };
|
|
69
|
+
case 'lt':
|
|
70
|
+
return { [field]: { $lt: value } };
|
|
71
|
+
case 'gte':
|
|
72
|
+
return { [field]: { $gte: value } };
|
|
73
|
+
case 'lte':
|
|
74
|
+
return { [field]: { $lte: value } };
|
|
75
|
+
case 'in':
|
|
76
|
+
return { [field]: { $in: value } };
|
|
77
|
+
case 'notIn':
|
|
78
|
+
return { [field]: { $nin: value } };
|
|
79
|
+
case 'contains':
|
|
80
|
+
return { [field]: { $regex: escapeRegex(value), $options: 'i' } };
|
|
81
|
+
case 'startsWith':
|
|
82
|
+
return { [field]: { $regex: `^${escapeRegex(value)}`, $options: 'i' } };
|
|
83
|
+
case 'endsWith':
|
|
84
|
+
return { [field]: { $regex: `${escapeRegex(value)}$`, $options: 'i' } };
|
|
85
|
+
case 'like': {
|
|
86
|
+
// Convert SQL-like patterns to regex
|
|
87
|
+
const likePattern = value
|
|
88
|
+
.replace(/\\%/g, '\0')
|
|
89
|
+
.replace(/%/g, '.*')
|
|
90
|
+
.replace(/\0/g, '%')
|
|
91
|
+
.replace(/\\_/g, '\0')
|
|
92
|
+
.replace(/_/g, '.')
|
|
93
|
+
.replace(/\0/g, '_');
|
|
94
|
+
return { [field]: { $regex: `^${likePattern}$`, $options: 'i' } };
|
|
95
|
+
}
|
|
96
|
+
case 'regex':
|
|
97
|
+
case 'matches':
|
|
98
|
+
return { [field]: { $regex: value } };
|
|
99
|
+
default:
|
|
100
|
+
throw new Error(`Unsupported operator: ${op}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Transform a logical node to Mongoose format
|
|
105
|
+
*/
|
|
106
|
+
function transformLogicalNode(node) {
|
|
107
|
+
const leftFilter = transformNode(node.left);
|
|
108
|
+
const rightFilter = transformNode(node.right);
|
|
109
|
+
if (node.type === 'AND') {
|
|
110
|
+
// Merge filters
|
|
111
|
+
return { ...leftFilter, ...rightFilter };
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// OR operation
|
|
115
|
+
return { $or: [leftFilter, rightFilter] };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Transform a NOT node to Mongoose format
|
|
120
|
+
*/
|
|
121
|
+
function transformNotNode(node) {
|
|
122
|
+
const operandFilter = transformNode(node.operand);
|
|
123
|
+
return { $nor: [operandFilter] };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Transform a BETWEEN node to Mongoose format
|
|
127
|
+
*/
|
|
128
|
+
function transformBetweenNode(node) {
|
|
129
|
+
return {
|
|
130
|
+
[node.field]: {
|
|
131
|
+
$gte: node.min,
|
|
132
|
+
$lte: node.max,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Transform a NULL_CHECK node to Mongoose format
|
|
138
|
+
*/
|
|
139
|
+
function transformNullCheckNode(node) {
|
|
140
|
+
if (node.isNull) {
|
|
141
|
+
return { [node.field]: null };
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
return { [node.field]: { $ne: null } };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Escape special regex characters
|
|
149
|
+
*/
|
|
150
|
+
function escapeRegex(str) {
|
|
151
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=mongoose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoose.js","sourceRoot":"","sources":["../../src/adapters/mongoose.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { QastNode } from '../types/ast';
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
2
|
/**
|
|
3
3
|
* Prisma filter type
|
|
4
4
|
*/
|
|
5
5
|
export type PrismaFilter = {
|
|
6
6
|
where: Record<string, any>;
|
|
7
|
+
orderBy?: Record<string, 'asc' | 'desc'> | Array<Record<string, 'asc' | 'desc'>>;
|
|
8
|
+
take?: number;
|
|
9
|
+
skip?: number;
|
|
7
10
|
};
|
|
8
11
|
/**
|
|
9
12
|
* Transform a QAST AST node to a Prisma filter
|
|
10
13
|
*/
|
|
11
|
-
export declare function toPrismaFilter(ast: QastNode): PrismaFilter;
|
|
14
|
+
export declare function toPrismaFilter(ast: QastNode | QueryAST): PrismaFilter;
|
|
12
15
|
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAMT,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAmCrE"}
|