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.
Files changed (84) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +775 -520
  3. package/README.zh-CN.md +520 -0
  4. package/dist/adapters/drizzle.d.ts +66 -0
  5. package/dist/adapters/drizzle.d.ts.map +1 -0
  6. package/dist/adapters/drizzle.js +222 -0
  7. package/dist/adapters/drizzle.js.map +1 -0
  8. package/dist/adapters/knex.d.ts +22 -0
  9. package/dist/adapters/knex.d.ts.map +1 -0
  10. package/dist/adapters/knex.js +158 -0
  11. package/dist/adapters/knex.js.map +1 -0
  12. package/dist/adapters/mongoose.d.ts +15 -0
  13. package/dist/adapters/mongoose.d.ts.map +1 -0
  14. package/dist/adapters/mongoose.js +153 -0
  15. package/dist/adapters/mongoose.js.map +1 -0
  16. package/dist/adapters/prisma.d.ts +5 -2
  17. package/dist/adapters/prisma.d.ts.map +1 -1
  18. package/dist/adapters/prisma.js +102 -4
  19. package/dist/adapters/prisma.js.map +1 -1
  20. package/dist/adapters/sequelize.d.ts +26 -8
  21. package/dist/adapters/sequelize.d.ts.map +1 -1
  22. package/dist/adapters/sequelize.js +168 -7
  23. package/dist/adapters/sequelize.js.map +1 -1
  24. package/dist/adapters/typeorm.d.ts +32 -2
  25. package/dist/adapters/typeorm.d.ts.map +1 -1
  26. package/dist/adapters/typeorm.js +169 -3
  27. package/dist/adapters/typeorm.js.map +1 -1
  28. package/dist/builder/query-builder.d.ts +139 -0
  29. package/dist/builder/query-builder.d.ts.map +1 -0
  30. package/dist/builder/query-builder.js +320 -0
  31. package/dist/builder/query-builder.js.map +1 -0
  32. package/dist/errors.d.ts +18 -3
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +130 -10
  35. package/dist/errors.js.map +1 -1
  36. package/dist/index.d.ts +77 -11
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +124 -16
  39. package/dist/index.js.map +1 -1
  40. package/dist/integrations/express.d.ts +14 -0
  41. package/dist/integrations/express.d.ts.map +1 -0
  42. package/dist/integrations/express.js +33 -0
  43. package/dist/integrations/express.js.map +1 -0
  44. package/dist/integrations/fastify.d.ts +17 -0
  45. package/dist/integrations/fastify.d.ts.map +1 -0
  46. package/dist/integrations/fastify.js +35 -0
  47. package/dist/integrations/fastify.js.map +1 -0
  48. package/dist/integrations/hono.d.ts +14 -0
  49. package/dist/integrations/hono.d.ts.map +1 -0
  50. package/dist/integrations/hono.js +30 -0
  51. package/dist/integrations/hono.js.map +1 -0
  52. package/dist/integrations/nestjs.d.ts +23 -0
  53. package/dist/integrations/nestjs.d.ts.map +1 -0
  54. package/dist/integrations/nestjs.js +137 -0
  55. package/dist/integrations/nestjs.js.map +1 -0
  56. package/dist/parser/parser.d.ts +15 -7
  57. package/dist/parser/parser.d.ts.map +1 -1
  58. package/dist/parser/parser.js +117 -15
  59. package/dist/parser/parser.js.map +1 -1
  60. package/dist/parser/tokenizer.d.ts +11 -1
  61. package/dist/parser/tokenizer.d.ts.map +1 -1
  62. package/dist/parser/tokenizer.js +67 -10
  63. package/dist/parser/tokenizer.js.map +1 -1
  64. package/dist/parser/validator.d.ts +39 -0
  65. package/dist/parser/validator.d.ts.map +1 -1
  66. package/dist/parser/validator.js +144 -3
  67. package/dist/parser/validator.js.map +1 -1
  68. package/dist/types/ast.d.ts +59 -3
  69. package/dist/types/ast.d.ts.map +1 -1
  70. package/dist/types/ast.js +21 -0
  71. package/dist/types/ast.js.map +1 -1
  72. package/dist/utils/ast-utils.d.ts +43 -0
  73. package/dist/utils/ast-utils.d.ts.map +1 -0
  74. package/dist/utils/ast-utils.js +205 -0
  75. package/dist/utils/ast-utils.js.map +1 -0
  76. package/dist/utils/cache.d.ts +47 -0
  77. package/dist/utils/cache.d.ts.map +1 -0
  78. package/dist/utils/cache.js +132 -0
  79. package/dist/utils/cache.js.map +1 -0
  80. package/dist/utils/serializer.d.ts +6 -0
  81. package/dist/utils/serializer.d.ts.map +1 -0
  82. package/dist/utils/serializer.js +140 -0
  83. package/dist/utils/serializer.js.map +1 -0
  84. 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,EAAE,QAAQ,EAAgE,MAAM,cAAc,CAAC;AAEtG;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,CAI1D"}
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"}