qast 1.2.0 → 2.0.0
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 +260 -5
- 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 +152 -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 +103 -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 +127 -9
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +83 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +108 -8
- 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 +29 -5
package/dist/adapters/prisma.js
CHANGED
|
@@ -6,9 +6,38 @@ const ast_1 = require("../types/ast");
|
|
|
6
6
|
* Transform a QAST AST node to a Prisma filter
|
|
7
7
|
*/
|
|
8
8
|
function toPrismaFilter(ast) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
if ('filter' in ast) {
|
|
10
|
+
// It's a QueryAST
|
|
11
|
+
const queryAST = ast;
|
|
12
|
+
const result = {
|
|
13
|
+
where: transformNode(queryAST.filter),
|
|
14
|
+
};
|
|
15
|
+
if (queryAST.orderBy && queryAST.orderBy.length > 0) {
|
|
16
|
+
if (queryAST.orderBy.length === 1) {
|
|
17
|
+
result.orderBy = {
|
|
18
|
+
[queryAST.orderBy[0].field]: queryAST.orderBy[0].direction,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
result.orderBy = queryAST.orderBy.map(clause => ({
|
|
23
|
+
[clause.field]: clause.direction,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (queryAST.limit !== undefined) {
|
|
28
|
+
result.take = queryAST.limit;
|
|
29
|
+
}
|
|
30
|
+
if (queryAST.offset !== undefined) {
|
|
31
|
+
result.skip = queryAST.offset;
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// It's just a QastNode (backward compatibility)
|
|
37
|
+
return {
|
|
38
|
+
where: transformNode(ast),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
12
41
|
}
|
|
13
42
|
/**
|
|
14
43
|
* Transform a node to Prisma format
|
|
@@ -20,7 +49,16 @@ function transformNode(node) {
|
|
|
20
49
|
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
21
50
|
return transformLogicalNode(node);
|
|
22
51
|
}
|
|
23
|
-
|
|
52
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
53
|
+
return transformNotNode(node);
|
|
54
|
+
}
|
|
55
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
56
|
+
return transformBetweenNode(node);
|
|
57
|
+
}
|
|
58
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
59
|
+
return transformNullCheckNode(node);
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Invalid node type: ${node.type}`);
|
|
24
62
|
}
|
|
25
63
|
/**
|
|
26
64
|
* Transform a comparison node to Prisma format
|
|
@@ -43,12 +81,36 @@ function transformComparisonNode(node) {
|
|
|
43
81
|
return { [field]: { lte: value } };
|
|
44
82
|
case 'in':
|
|
45
83
|
return { [field]: { in: value } };
|
|
84
|
+
case 'notIn':
|
|
85
|
+
return { [field]: { notIn: value } };
|
|
46
86
|
case 'contains':
|
|
47
87
|
return { [field]: { contains: value } };
|
|
48
88
|
case 'startsWith':
|
|
49
89
|
return { [field]: { startsWith: value } };
|
|
50
90
|
case 'endsWith':
|
|
51
91
|
return { [field]: { endsWith: value } };
|
|
92
|
+
case 'like':
|
|
93
|
+
// Prisma doesn't have a direct 'like' operator, use contains with pattern matching
|
|
94
|
+
// For now, we'll convert % wildcards to contains/startsWith/endsWith
|
|
95
|
+
// Simple implementation: treat like as contains
|
|
96
|
+
const likeValue = value;
|
|
97
|
+
if (likeValue.startsWith('%') && likeValue.endsWith('%')) {
|
|
98
|
+
return { [field]: { contains: likeValue.slice(1, -1) } };
|
|
99
|
+
}
|
|
100
|
+
else if (likeValue.startsWith('%')) {
|
|
101
|
+
return { [field]: { endsWith: likeValue.slice(1) } };
|
|
102
|
+
}
|
|
103
|
+
else if (likeValue.endsWith('%')) {
|
|
104
|
+
return { [field]: { startsWith: likeValue.slice(0, -1) } };
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return { [field]: { contains: likeValue } };
|
|
108
|
+
}
|
|
109
|
+
case 'regex':
|
|
110
|
+
case 'matches':
|
|
111
|
+
// Prisma doesn't support regex directly, but we can use a pattern
|
|
112
|
+
// Note: This is a simplified implementation
|
|
113
|
+
return { [field]: { contains: value } };
|
|
52
114
|
default:
|
|
53
115
|
throw new Error(`Unsupported operator: ${op}`);
|
|
54
116
|
}
|
|
@@ -133,4 +195,41 @@ function mergeFilters(left, right) {
|
|
|
133
195
|
}
|
|
134
196
|
return result;
|
|
135
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* Transform a NOT node to Prisma format
|
|
200
|
+
*/
|
|
201
|
+
function transformNotNode(node) {
|
|
202
|
+
const operandFilter = transformNode(node.operand);
|
|
203
|
+
return {
|
|
204
|
+
NOT: operandFilter,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Transform a BETWEEN node to Prisma format
|
|
209
|
+
*/
|
|
210
|
+
function transformBetweenNode(node) {
|
|
211
|
+
return {
|
|
212
|
+
[node.field]: {
|
|
213
|
+
gte: node.min,
|
|
214
|
+
lte: node.max,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Transform a NULL_CHECK node to Prisma format
|
|
220
|
+
*/
|
|
221
|
+
function transformNullCheckNode(node) {
|
|
222
|
+
if (node.isNull) {
|
|
223
|
+
return {
|
|
224
|
+
[node.field]: null,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
return {
|
|
229
|
+
[node.field]: {
|
|
230
|
+
not: null,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
136
235
|
//# sourceMappingURL=prisma.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QastNode } from '../types/ast';
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
2
|
/**
|
|
3
3
|
* Sequelize filter type
|
|
4
4
|
*
|
|
@@ -12,26 +12,44 @@ import { QastNode } from '../types/ast';
|
|
|
12
12
|
* For other operators, you need Op: { age: { [Op.gt]: 25 } }
|
|
13
13
|
* For logical operations, you need Op.and/Op.or: { [Op.and]: [...] }
|
|
14
14
|
*/
|
|
15
|
-
export type SequelizeFilter =
|
|
15
|
+
export type SequelizeFilter = {
|
|
16
|
+
where?: Record<string, any>;
|
|
17
|
+
order?: Array<[string, 'ASC' | 'DESC']>;
|
|
18
|
+
limit?: number;
|
|
19
|
+
offset?: number;
|
|
20
|
+
};
|
|
16
21
|
/**
|
|
17
22
|
* Transform a QAST AST node to a Sequelize filter
|
|
18
23
|
*
|
|
19
24
|
* IMPORTANT: Sequelize uses the Op object from 'sequelize', not $ operators.
|
|
20
25
|
* This adapter returns a structure with metadata that you need to transform.
|
|
21
26
|
*
|
|
27
|
+
* Use transformSequelizeOperators() helper function to convert metadata to actual Sequelize Op operators.
|
|
28
|
+
*
|
|
22
29
|
* Example usage:
|
|
23
30
|
* ```ts
|
|
24
31
|
* import { Op } from 'sequelize';
|
|
25
|
-
* import { toSequelizeFilter } from 'qast';
|
|
32
|
+
* import { toSequelizeFilter, transformSequelizeOperators } from 'qast';
|
|
26
33
|
*
|
|
27
34
|
* const filter = toSequelizeFilter(ast);
|
|
28
|
-
*
|
|
29
|
-
* // { age: { __qast_operator__: 'gt', value: 25 } }
|
|
30
|
-
* // You need to transform it:
|
|
31
|
-
* // { age: { [Op.gt]: 25 } }
|
|
35
|
+
* const transformed = transformSequelizeOperators(filter.where, Op);
|
|
32
36
|
* ```
|
|
33
37
|
*
|
|
34
38
|
* For simple equality (eq operator), you can use plain values directly.
|
|
35
39
|
*/
|
|
36
|
-
export declare function toSequelizeFilter(ast: QastNode): SequelizeFilter;
|
|
40
|
+
export declare function toSequelizeFilter(ast: QastNode | QueryAST): SequelizeFilter;
|
|
41
|
+
/**
|
|
42
|
+
* Helper function to transform QAST metadata to Sequelize Op operators
|
|
43
|
+
* This function requires Sequelize to be installed and Op to be imported.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* import { Op } from 'sequelize';
|
|
48
|
+
* import { toSequelizeFilter, transformSequelizeOperators } from 'qast';
|
|
49
|
+
*
|
|
50
|
+
* const filter = toSequelizeFilter(ast);
|
|
51
|
+
* const transformed = transformSequelizeOperators(filter.where, Op);
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function transformSequelizeOperators(where: Record<string, any>, Op: any): Record<string, any>;
|
|
37
55
|
//# sourceMappingURL=sequelize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAMT,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,eAAe,CA8B3E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,EAAE,EAAE,GAAG,GACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAuErB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.toSequelizeFilter = toSequelizeFilter;
|
|
4
|
+
exports.transformSequelizeOperators = transformSequelizeOperators;
|
|
4
5
|
const ast_1 = require("../types/ast");
|
|
5
6
|
/**
|
|
6
7
|
* Transform a QAST AST node to a Sequelize filter
|
|
@@ -8,22 +9,133 @@ const ast_1 = require("../types/ast");
|
|
|
8
9
|
* IMPORTANT: Sequelize uses the Op object from 'sequelize', not $ operators.
|
|
9
10
|
* This adapter returns a structure with metadata that you need to transform.
|
|
10
11
|
*
|
|
12
|
+
* Use transformSequelizeOperators() helper function to convert metadata to actual Sequelize Op operators.
|
|
13
|
+
*
|
|
11
14
|
* Example usage:
|
|
12
15
|
* ```ts
|
|
13
16
|
* import { Op } from 'sequelize';
|
|
14
|
-
* import { toSequelizeFilter } from 'qast';
|
|
17
|
+
* import { toSequelizeFilter, transformSequelizeOperators } from 'qast';
|
|
15
18
|
*
|
|
16
19
|
* const filter = toSequelizeFilter(ast);
|
|
17
|
-
*
|
|
18
|
-
* // { age: { __qast_operator__: 'gt', value: 25 } }
|
|
19
|
-
* // You need to transform it:
|
|
20
|
-
* // { age: { [Op.gt]: 25 } }
|
|
20
|
+
* const transformed = transformSequelizeOperators(filter.where, Op);
|
|
21
21
|
* ```
|
|
22
22
|
*
|
|
23
23
|
* For simple equality (eq operator), you can use plain values directly.
|
|
24
24
|
*/
|
|
25
25
|
function toSequelizeFilter(ast) {
|
|
26
|
-
|
|
26
|
+
if ('filter' in ast) {
|
|
27
|
+
// It's a QueryAST
|
|
28
|
+
const queryAST = ast;
|
|
29
|
+
const result = {
|
|
30
|
+
where: transformNode(queryAST.filter),
|
|
31
|
+
};
|
|
32
|
+
if (queryAST.orderBy && queryAST.orderBy.length > 0) {
|
|
33
|
+
result.order = queryAST.orderBy.map(clause => [
|
|
34
|
+
clause.field,
|
|
35
|
+
clause.direction.toUpperCase(),
|
|
36
|
+
]);
|
|
37
|
+
}
|
|
38
|
+
if (queryAST.limit !== undefined) {
|
|
39
|
+
result.limit = queryAST.limit;
|
|
40
|
+
}
|
|
41
|
+
if (queryAST.offset !== undefined) {
|
|
42
|
+
result.offset = queryAST.offset;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// It's just a QastNode (backward compatibility)
|
|
48
|
+
return {
|
|
49
|
+
where: transformNode(ast),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Helper function to transform QAST metadata to Sequelize Op operators
|
|
55
|
+
* This function requires Sequelize to be installed and Op to be imported.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { Op } from 'sequelize';
|
|
60
|
+
* import { toSequelizeFilter, transformSequelizeOperators } from 'qast';
|
|
61
|
+
*
|
|
62
|
+
* const filter = toSequelizeFilter(ast);
|
|
63
|
+
* const transformed = transformSequelizeOperators(filter.where, Op);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
function transformSequelizeOperators(where, Op) {
|
|
67
|
+
const result = {};
|
|
68
|
+
for (const [key, value] of Object.entries(where)) {
|
|
69
|
+
if (value && typeof value === 'object' && '__qast_operator__' in value) {
|
|
70
|
+
const op = value.__qast_operator__;
|
|
71
|
+
const opValue = value.value;
|
|
72
|
+
switch (op) {
|
|
73
|
+
case 'gt':
|
|
74
|
+
result[key] = { [Op.gt]: opValue };
|
|
75
|
+
break;
|
|
76
|
+
case 'lt':
|
|
77
|
+
result[key] = { [Op.lt]: opValue };
|
|
78
|
+
break;
|
|
79
|
+
case 'gte':
|
|
80
|
+
result[key] = { [Op.gte]: opValue };
|
|
81
|
+
break;
|
|
82
|
+
case 'lte':
|
|
83
|
+
result[key] = { [Op.lte]: opValue };
|
|
84
|
+
break;
|
|
85
|
+
case 'ne':
|
|
86
|
+
result[key] = { [Op.ne]: opValue };
|
|
87
|
+
break;
|
|
88
|
+
case 'in':
|
|
89
|
+
result[key] = { [Op.in]: opValue };
|
|
90
|
+
break;
|
|
91
|
+
case 'notIn':
|
|
92
|
+
result[key] = { [Op.notIn]: opValue };
|
|
93
|
+
break;
|
|
94
|
+
case 'contains':
|
|
95
|
+
result[key] = { [Op.like]: `%${opValue}%` };
|
|
96
|
+
break;
|
|
97
|
+
case 'startsWith':
|
|
98
|
+
result[key] = { [Op.startsWith]: opValue };
|
|
99
|
+
break;
|
|
100
|
+
case 'endsWith':
|
|
101
|
+
result[key] = { [Op.endsWith]: opValue };
|
|
102
|
+
break;
|
|
103
|
+
case 'like':
|
|
104
|
+
result[key] = { [Op.like]: opValue };
|
|
105
|
+
break;
|
|
106
|
+
case 'regex':
|
|
107
|
+
case 'matches':
|
|
108
|
+
// Sequelize uses Op.regexp for regex matching
|
|
109
|
+
result[key] = Op.regexp ? { [Op.regexp]: opValue } : { [Op.like]: opValue };
|
|
110
|
+
break;
|
|
111
|
+
case 'between':
|
|
112
|
+
result[key] = { [Op.between]: [opValue.min, opValue.max] };
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
result[key] = value;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (value && typeof value === 'object' && '__qast_null_check__' in value) {
|
|
119
|
+
if (value.__qast_null_check__ === true) {
|
|
120
|
+
result[key] = { [Op.is]: null };
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
result[key] = { [Op.not]: null };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (value && typeof value === 'object' && '__qast_logical__' in value) {
|
|
127
|
+
const logical = value.__qast_logical__;
|
|
128
|
+
const conditions = value.conditions.map((cond) => transformSequelizeOperators(cond, Op));
|
|
129
|
+
result[Op[logical]] = conditions;
|
|
130
|
+
}
|
|
131
|
+
else if (value && typeof value === 'object' && '__qast_not__' in value) {
|
|
132
|
+
result[Op.not] = transformSequelizeOperators(value.__qast_not__, Op);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
result[key] = value;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
27
139
|
}
|
|
28
140
|
/**
|
|
29
141
|
* Transform a node to Sequelize format
|
|
@@ -35,7 +147,16 @@ function transformNode(node) {
|
|
|
35
147
|
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
36
148
|
return transformLogicalNode(node);
|
|
37
149
|
}
|
|
38
|
-
|
|
150
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
151
|
+
return transformNotNode(node);
|
|
152
|
+
}
|
|
153
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
154
|
+
return transformBetweenNode(node);
|
|
155
|
+
}
|
|
156
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
157
|
+
return transformNullCheckNode(node);
|
|
158
|
+
}
|
|
159
|
+
throw new Error(`Invalid node type: ${node.type}`);
|
|
39
160
|
}
|
|
40
161
|
/**
|
|
41
162
|
* Transform a comparison node to Sequelize format
|
|
@@ -76,6 +197,13 @@ function transformComparisonNode(node) {
|
|
|
76
197
|
return { [field]: { __qast_operator__: 'startsWith', value } };
|
|
77
198
|
case 'endsWith':
|
|
78
199
|
return { [field]: { __qast_operator__: 'endsWith', value } };
|
|
200
|
+
case 'notIn':
|
|
201
|
+
return { [field]: { __qast_operator__: 'notIn', value } };
|
|
202
|
+
case 'like':
|
|
203
|
+
return { [field]: { __qast_operator__: 'like', value } };
|
|
204
|
+
case 'regex':
|
|
205
|
+
case 'matches':
|
|
206
|
+
return { [field]: { __qast_operator__: 'regex', value } };
|
|
79
207
|
default:
|
|
80
208
|
throw new Error(`Unsupported operator: ${op}`);
|
|
81
209
|
}
|
|
@@ -167,4 +295,37 @@ function transformLogicalNode(node) {
|
|
|
167
295
|
}
|
|
168
296
|
}
|
|
169
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Transform a NOT node to Sequelize format
|
|
300
|
+
*/
|
|
301
|
+
function transformNotNode(node) {
|
|
302
|
+
const operandFilter = transformNode(node.operand);
|
|
303
|
+
return {
|
|
304
|
+
__qast_not__: operandFilter,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Transform a BETWEEN node to Sequelize format
|
|
309
|
+
*/
|
|
310
|
+
function transformBetweenNode(node) {
|
|
311
|
+
return {
|
|
312
|
+
[node.field]: {
|
|
313
|
+
__qast_operator__: 'between',
|
|
314
|
+
value: {
|
|
315
|
+
min: node.min,
|
|
316
|
+
max: node.max,
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Transform a NULL_CHECK node to Sequelize format
|
|
323
|
+
*/
|
|
324
|
+
function transformNullCheckNode(node) {
|
|
325
|
+
return {
|
|
326
|
+
[node.field]: {
|
|
327
|
+
__qast_null_check__: node.isNull,
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
}
|
|
170
331
|
//# sourceMappingURL=sequelize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize.js","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"sequelize.js","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QastNode } from '../types/ast';
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
2
|
/**
|
|
3
3
|
* TypeORM filter type
|
|
4
4
|
* Note: This returns a plain object that can be used with TypeORM's FindOptions
|
|
@@ -6,6 +6,9 @@ import { QastNode } from '../types/ast';
|
|
|
6
6
|
*/
|
|
7
7
|
export type TypeORMFilter = {
|
|
8
8
|
where: Record<string, any> | Array<Record<string, any>>;
|
|
9
|
+
order?: Record<string, 'ASC' | 'DESC'> | Array<Record<string, 'ASC' | 'DESC'>>;
|
|
10
|
+
take?: number;
|
|
11
|
+
skip?: number;
|
|
9
12
|
};
|
|
10
13
|
/**
|
|
11
14
|
* Transform a QAST AST node to a TypeORM filter
|
|
@@ -13,6 +16,33 @@ export type TypeORMFilter = {
|
|
|
13
16
|
* Note: TypeORM uses operator functions like MoreThan(), LessThan(), etc.
|
|
14
17
|
* This adapter returns a structure that can be used with TypeORM's FindOptions.
|
|
15
18
|
* For production use, users may need to wrap values with TypeORM operators.
|
|
19
|
+
*
|
|
20
|
+
* Use transformTypeORMOperators() helper function to convert metadata to actual TypeORM operators.
|
|
21
|
+
*/
|
|
22
|
+
export declare function toTypeORMFilter(ast: QastNode | QueryAST): TypeORMFilter;
|
|
23
|
+
/**
|
|
24
|
+
* Helper function to transform QAST metadata to TypeORM operators
|
|
25
|
+
* This function requires TypeORM to be installed and imported.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { MoreThan, LessThan, Like, In, Not, IsNull } from 'typeorm';
|
|
30
|
+
* import { toTypeORMFilter, transformTypeORMOperators } from 'qast';
|
|
31
|
+
*
|
|
32
|
+
* const filter = toTypeORMFilter(ast);
|
|
33
|
+
* const transformed = transformTypeORMOperators(filter.where, {
|
|
34
|
+
* MoreThan, LessThan, Like, In, Not, IsNull
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
16
37
|
*/
|
|
17
|
-
export declare function
|
|
38
|
+
export declare function transformTypeORMOperators(where: Record<string, any> | Array<Record<string, any>>, operators: {
|
|
39
|
+
MoreThan?: (value: any) => any;
|
|
40
|
+
LessThan?: (value: any) => any;
|
|
41
|
+
MoreThanOrEqual?: (value: any) => any;
|
|
42
|
+
LessThanOrEqual?: (value: any) => any;
|
|
43
|
+
Like?: (value: string) => any;
|
|
44
|
+
In?: (value: any[]) => any;
|
|
45
|
+
Not?: (value: any) => any;
|
|
46
|
+
IsNull?: () => any;
|
|
47
|
+
}): Record<string, any> | Array<Record<string, any>>;
|
|
18
48
|
//# sourceMappingURL=typeorm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm.d.ts","sourceRoot":"","sources":["../../src/adapters/typeorm.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"typeorm.d.ts","sourceRoot":"","sources":["../../src/adapters/typeorm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAMT,MAAM,cAAc,CAAC;AAEtB;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAmCvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACvD,SAAS,EAAE;IACT,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;IAC9B,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC;CACpB,GACA,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAkElD"}
|