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.
Files changed (83) hide show
  1. package/README.md +260 -5
  2. package/README.zh-CN.md +520 -0
  3. package/dist/adapters/drizzle.d.ts +66 -0
  4. package/dist/adapters/drizzle.d.ts.map +1 -0
  5. package/dist/adapters/drizzle.js +222 -0
  6. package/dist/adapters/drizzle.js.map +1 -0
  7. package/dist/adapters/knex.d.ts +22 -0
  8. package/dist/adapters/knex.d.ts.map +1 -0
  9. package/dist/adapters/knex.js +158 -0
  10. package/dist/adapters/knex.js.map +1 -0
  11. package/dist/adapters/mongoose.d.ts +15 -0
  12. package/dist/adapters/mongoose.d.ts.map +1 -0
  13. package/dist/adapters/mongoose.js +152 -0
  14. package/dist/adapters/mongoose.js.map +1 -0
  15. package/dist/adapters/prisma.d.ts +5 -2
  16. package/dist/adapters/prisma.d.ts.map +1 -1
  17. package/dist/adapters/prisma.js +103 -4
  18. package/dist/adapters/prisma.js.map +1 -1
  19. package/dist/adapters/sequelize.d.ts +26 -8
  20. package/dist/adapters/sequelize.d.ts.map +1 -1
  21. package/dist/adapters/sequelize.js +168 -7
  22. package/dist/adapters/sequelize.js.map +1 -1
  23. package/dist/adapters/typeorm.d.ts +32 -2
  24. package/dist/adapters/typeorm.d.ts.map +1 -1
  25. package/dist/adapters/typeorm.js +169 -3
  26. package/dist/adapters/typeorm.js.map +1 -1
  27. package/dist/builder/query-builder.d.ts +139 -0
  28. package/dist/builder/query-builder.d.ts.map +1 -0
  29. package/dist/builder/query-builder.js +320 -0
  30. package/dist/builder/query-builder.js.map +1 -0
  31. package/dist/errors.d.ts +18 -3
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +127 -9
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +83 -8
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +108 -8
  38. package/dist/index.js.map +1 -1
  39. package/dist/integrations/express.d.ts +14 -0
  40. package/dist/integrations/express.d.ts.map +1 -0
  41. package/dist/integrations/express.js +33 -0
  42. package/dist/integrations/express.js.map +1 -0
  43. package/dist/integrations/fastify.d.ts +17 -0
  44. package/dist/integrations/fastify.d.ts.map +1 -0
  45. package/dist/integrations/fastify.js +35 -0
  46. package/dist/integrations/fastify.js.map +1 -0
  47. package/dist/integrations/hono.d.ts +14 -0
  48. package/dist/integrations/hono.d.ts.map +1 -0
  49. package/dist/integrations/hono.js +30 -0
  50. package/dist/integrations/hono.js.map +1 -0
  51. package/dist/integrations/nestjs.d.ts +23 -0
  52. package/dist/integrations/nestjs.d.ts.map +1 -0
  53. package/dist/integrations/nestjs.js +137 -0
  54. package/dist/integrations/nestjs.js.map +1 -0
  55. package/dist/parser/parser.d.ts +15 -7
  56. package/dist/parser/parser.d.ts.map +1 -1
  57. package/dist/parser/parser.js +117 -15
  58. package/dist/parser/parser.js.map +1 -1
  59. package/dist/parser/tokenizer.d.ts +11 -1
  60. package/dist/parser/tokenizer.d.ts.map +1 -1
  61. package/dist/parser/tokenizer.js +67 -10
  62. package/dist/parser/tokenizer.js.map +1 -1
  63. package/dist/parser/validator.d.ts +39 -0
  64. package/dist/parser/validator.d.ts.map +1 -1
  65. package/dist/parser/validator.js +144 -3
  66. package/dist/parser/validator.js.map +1 -1
  67. package/dist/types/ast.d.ts +59 -3
  68. package/dist/types/ast.d.ts.map +1 -1
  69. package/dist/types/ast.js +21 -0
  70. package/dist/types/ast.js.map +1 -1
  71. package/dist/utils/ast-utils.d.ts +43 -0
  72. package/dist/utils/ast-utils.d.ts.map +1 -0
  73. package/dist/utils/ast-utils.js +205 -0
  74. package/dist/utils/ast-utils.js.map +1 -0
  75. package/dist/utils/cache.d.ts +47 -0
  76. package/dist/utils/cache.d.ts.map +1 -0
  77. package/dist/utils/cache.js +132 -0
  78. package/dist/utils/cache.js.map +1 -0
  79. package/dist/utils/serializer.d.ts +6 -0
  80. package/dist/utils/serializer.d.ts.map +1 -0
  81. package/dist/utils/serializer.js +140 -0
  82. package/dist/utils/serializer.js.map +1 -0
  83. package/package.json +29 -5
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cloneAST = cloneAST;
4
+ exports.mergeQueries = mergeQueries;
5
+ exports.getQueryStats = getQueryStats;
6
+ exports.diffQueries = diffQueries;
7
+ exports.optimizeAST = optimizeAST;
8
+ const ast_1 = require("../types/ast");
9
+ /**
10
+ * Deep clone an AST node
11
+ */
12
+ function cloneAST(node) {
13
+ if ((0, ast_1.isComparisonNode)(node)) {
14
+ return {
15
+ type: 'COMPARISON',
16
+ field: node.field,
17
+ op: node.op,
18
+ value: Array.isArray(node.value) ? [...node.value] : node.value,
19
+ };
20
+ }
21
+ else if ((0, ast_1.isLogicalNode)(node)) {
22
+ return {
23
+ type: node.type,
24
+ left: cloneAST(node.left),
25
+ right: cloneAST(node.right),
26
+ };
27
+ }
28
+ else if ((0, ast_1.isNotNode)(node)) {
29
+ return {
30
+ type: 'NOT',
31
+ operand: cloneAST(node.operand),
32
+ };
33
+ }
34
+ else if ((0, ast_1.isBetweenNode)(node)) {
35
+ return {
36
+ type: 'BETWEEN',
37
+ field: node.field,
38
+ min: node.min,
39
+ max: node.max,
40
+ };
41
+ }
42
+ else if ((0, ast_1.isNullCheckNode)(node)) {
43
+ return {
44
+ type: 'NULL_CHECK',
45
+ field: node.field,
46
+ isNull: node.isNull,
47
+ };
48
+ }
49
+ throw new Error(`Unknown node type: ${node.type}`);
50
+ }
51
+ /**
52
+ * Merge two queries with a logical operator
53
+ */
54
+ function mergeQueries(left, right, op) {
55
+ return {
56
+ type: op,
57
+ left: cloneAST(left),
58
+ right: cloneAST(right),
59
+ };
60
+ }
61
+ /**
62
+ * Get statistics about a query AST
63
+ */
64
+ function getQueryStats(node) {
65
+ const stats = {
66
+ depth: 0,
67
+ nodeCount: 0,
68
+ comparisonCount: 0,
69
+ logicalCount: 0,
70
+ notCount: 0,
71
+ betweenCount: 0,
72
+ nullCheckCount: 0,
73
+ fields: [],
74
+ operators: [],
75
+ };
76
+ function traverse(n, depth) {
77
+ stats.nodeCount++;
78
+ stats.depth = Math.max(stats.depth, depth);
79
+ if ((0, ast_1.isComparisonNode)(n)) {
80
+ stats.comparisonCount++;
81
+ if (!stats.fields.includes(n.field)) {
82
+ stats.fields.push(n.field);
83
+ }
84
+ if (!stats.operators.includes(n.op)) {
85
+ stats.operators.push(n.op);
86
+ }
87
+ }
88
+ else if ((0, ast_1.isLogicalNode)(n)) {
89
+ stats.logicalCount++;
90
+ traverse(n.left, depth + 1);
91
+ traverse(n.right, depth + 1);
92
+ }
93
+ else if ((0, ast_1.isNotNode)(n)) {
94
+ stats.notCount++;
95
+ traverse(n.operand, depth + 1);
96
+ }
97
+ else if ((0, ast_1.isBetweenNode)(n)) {
98
+ stats.betweenCount++;
99
+ if (!stats.fields.includes(n.field)) {
100
+ stats.fields.push(n.field);
101
+ }
102
+ }
103
+ else if ((0, ast_1.isNullCheckNode)(n)) {
104
+ stats.nullCheckCount++;
105
+ if (!stats.fields.includes(n.field)) {
106
+ stats.fields.push(n.field);
107
+ }
108
+ }
109
+ }
110
+ traverse(node, 1);
111
+ return stats;
112
+ }
113
+ /**
114
+ * Compare two queries and return differences
115
+ */
116
+ function diffQueries(left, right) {
117
+ const differences = [];
118
+ function compare(l, r, path = 'root') {
119
+ if (l.type !== r.type) {
120
+ differences.push(`${path}: different types (${l.type} vs ${r.type})`);
121
+ return;
122
+ }
123
+ if ((0, ast_1.isComparisonNode)(l) && (0, ast_1.isComparisonNode)(r)) {
124
+ if (l.field !== r.field) {
125
+ differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
126
+ }
127
+ if (l.op !== r.op) {
128
+ differences.push(`${path}: different operators (${l.op} vs ${r.op})`);
129
+ }
130
+ if (JSON.stringify(l.value) !== JSON.stringify(r.value)) {
131
+ differences.push(`${path}: different values`);
132
+ }
133
+ }
134
+ else if ((0, ast_1.isLogicalNode)(l) && (0, ast_1.isLogicalNode)(r)) {
135
+ compare(l.left, r.left, `${path}.left`);
136
+ compare(l.right, r.right, `${path}.right`);
137
+ }
138
+ else if ((0, ast_1.isNotNode)(l) && (0, ast_1.isNotNode)(r)) {
139
+ compare(l.operand, r.operand, `${path}.operand`);
140
+ }
141
+ else if ((0, ast_1.isBetweenNode)(l) && (0, ast_1.isBetweenNode)(r)) {
142
+ if (l.field !== r.field) {
143
+ differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
144
+ }
145
+ if (l.min !== r.min || l.max !== r.max) {
146
+ differences.push(`${path}: different range values`);
147
+ }
148
+ }
149
+ else if ((0, ast_1.isNullCheckNode)(l) && (0, ast_1.isNullCheckNode)(r)) {
150
+ if (l.field !== r.field) {
151
+ differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
152
+ }
153
+ if (l.isNull !== r.isNull) {
154
+ differences.push(`${path}: different null check type`);
155
+ }
156
+ }
157
+ }
158
+ compare(left, right);
159
+ return {
160
+ identical: differences.length === 0,
161
+ differences,
162
+ };
163
+ }
164
+ /**
165
+ * Optimize an AST by simplifying redundant expressions
166
+ */
167
+ function optimizeAST(node) {
168
+ if ((0, ast_1.isComparisonNode)(node) || (0, ast_1.isBetweenNode)(node) || (0, ast_1.isNullCheckNode)(node)) {
169
+ return node; // Leaf nodes can't be optimized
170
+ }
171
+ if ((0, ast_1.isLogicalNode)(node)) {
172
+ const left = optimizeAST(node.left);
173
+ const right = optimizeAST(node.right);
174
+ // If both sides are identical, simplify
175
+ const diff = diffQueries(left, right);
176
+ if (diff.identical && node.type === 'AND') {
177
+ return left; // A AND A = A
178
+ }
179
+ // If left is always true/false, simplify
180
+ if ((0, ast_1.isComparisonNode)(left) && left.op === 'eq' && left.value === true && node.type === 'AND') {
181
+ return right; // true AND X = X
182
+ }
183
+ if ((0, ast_1.isComparisonNode)(left) && left.op === 'eq' && left.value === false && node.type === 'OR') {
184
+ return right; // false OR X = X
185
+ }
186
+ return {
187
+ type: node.type,
188
+ left,
189
+ right,
190
+ };
191
+ }
192
+ if ((0, ast_1.isNotNode)(node)) {
193
+ const operand = optimizeAST(node.operand);
194
+ // Double negation: not (not X) = X
195
+ if ((0, ast_1.isNotNode)(operand)) {
196
+ return operand.operand;
197
+ }
198
+ return {
199
+ type: 'NOT',
200
+ operand,
201
+ };
202
+ }
203
+ return node;
204
+ }
205
+ //# sourceMappingURL=ast-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { QastNode, QueryAST } from '../types/ast';
2
+ /**
3
+ * Simple LRU cache implementation for query results
4
+ */
5
+ export declare class QueryCache<T> {
6
+ private cache;
7
+ private maxSize;
8
+ private ttl?;
9
+ constructor(maxSize?: number, ttl?: number);
10
+ /**
11
+ * Generate cache key from query string or AST
12
+ */
13
+ private getKey;
14
+ /**
15
+ * Check if entry is expired
16
+ */
17
+ private isExpired;
18
+ /**
19
+ * Get value from cache
20
+ */
21
+ get(query: string | QastNode | QueryAST): T | undefined;
22
+ /**
23
+ * Set value in cache
24
+ */
25
+ set(query: string | QastNode | QueryAST, value: T): void;
26
+ /**
27
+ * Clear cache
28
+ */
29
+ clear(): void;
30
+ /**
31
+ * Get cache size
32
+ */
33
+ size(): number;
34
+ /**
35
+ * Remove expired entries
36
+ */
37
+ cleanup(): void;
38
+ }
39
+ /**
40
+ * Memoize a function that takes a query and returns a result
41
+ */
42
+ export declare function memoizeQuery<T>(fn: (query: string | QastNode | QueryAST) => T, maxSize?: number, ttl?: number): (query: string | QastNode | QueryAST) => T;
43
+ /**
44
+ * Create a cached query parser
45
+ */
46
+ export declare function createCachedParser(parseFn: (query: string) => QastNode | QueryAST, maxSize?: number, ttl?: number): (query: string) => QastNode | QueryAST;
47
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAUlD;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAC,CAAS;gBAET,OAAO,GAAE,MAAY,EAAE,GAAG,CAAC,EAAE,MAAM;IAM/C;;OAEG;IACH,OAAO,CAAC,MAAM;IASd;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,SAAS;IAoBvD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBxD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KAAK,CAAC,EAC9C,OAAO,GAAE,MAAY,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAa5C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,EAC/C,OAAO,GAAE,MAAY,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,CAaxC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryCache = void 0;
4
+ exports.memoizeQuery = memoizeQuery;
5
+ exports.createCachedParser = createCachedParser;
6
+ /**
7
+ * Simple LRU cache implementation for query results
8
+ */
9
+ class QueryCache {
10
+ constructor(maxSize = 100, ttl) {
11
+ this.cache = new Map();
12
+ this.maxSize = maxSize;
13
+ this.ttl = ttl;
14
+ }
15
+ /**
16
+ * Generate cache key from query string or AST
17
+ */
18
+ getKey(query) {
19
+ if (typeof query === 'string') {
20
+ return query;
21
+ }
22
+ // For AST nodes, use JSON stringification (simplified)
23
+ // In production, you might want a more sophisticated serialization
24
+ return JSON.stringify(query);
25
+ }
26
+ /**
27
+ * Check if entry is expired
28
+ */
29
+ isExpired(entry) {
30
+ if (!this.ttl) {
31
+ return false;
32
+ }
33
+ return Date.now() - entry.timestamp > this.ttl;
34
+ }
35
+ /**
36
+ * Get value from cache
37
+ */
38
+ get(query) {
39
+ const key = this.getKey(query);
40
+ const entry = this.cache.get(key);
41
+ if (!entry) {
42
+ return undefined;
43
+ }
44
+ if (this.isExpired(entry)) {
45
+ this.cache.delete(key);
46
+ return undefined;
47
+ }
48
+ // Move to end (LRU)
49
+ this.cache.delete(key);
50
+ this.cache.set(key, entry);
51
+ return entry.value;
52
+ }
53
+ /**
54
+ * Set value in cache
55
+ */
56
+ set(query, value) {
57
+ const key = this.getKey(query);
58
+ // Remove if exists to update position
59
+ if (this.cache.has(key)) {
60
+ this.cache.delete(key);
61
+ }
62
+ // Evict oldest if at capacity
63
+ if (this.cache.size >= this.maxSize) {
64
+ const firstKey = this.cache.keys().next().value;
65
+ if (firstKey !== undefined) {
66
+ this.cache.delete(firstKey);
67
+ }
68
+ }
69
+ this.cache.set(key, {
70
+ value,
71
+ timestamp: Date.now(),
72
+ });
73
+ }
74
+ /**
75
+ * Clear cache
76
+ */
77
+ clear() {
78
+ this.cache.clear();
79
+ }
80
+ /**
81
+ * Get cache size
82
+ */
83
+ size() {
84
+ return this.cache.size;
85
+ }
86
+ /**
87
+ * Remove expired entries
88
+ */
89
+ cleanup() {
90
+ if (!this.ttl) {
91
+ return;
92
+ }
93
+ const now = Date.now();
94
+ for (const [key, entry] of this.cache.entries()) {
95
+ if (now - entry.timestamp > this.ttl) {
96
+ this.cache.delete(key);
97
+ }
98
+ }
99
+ }
100
+ }
101
+ exports.QueryCache = QueryCache;
102
+ /**
103
+ * Memoize a function that takes a query and returns a result
104
+ */
105
+ function memoizeQuery(fn, maxSize = 100, ttl) {
106
+ const cache = new QueryCache(maxSize, ttl);
107
+ return (query) => {
108
+ const cached = cache.get(query);
109
+ if (cached !== undefined) {
110
+ return cached;
111
+ }
112
+ const result = fn(query);
113
+ cache.set(query, result);
114
+ return result;
115
+ };
116
+ }
117
+ /**
118
+ * Create a cached query parser
119
+ */
120
+ function createCachedParser(parseFn, maxSize = 100, ttl) {
121
+ const cache = new QueryCache(maxSize, ttl);
122
+ return (query) => {
123
+ const cached = cache.get(query);
124
+ if (cached !== undefined) {
125
+ return cached;
126
+ }
127
+ const result = parseFn(query);
128
+ cache.set(query, result);
129
+ return result;
130
+ };
131
+ }
132
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { QastNode, QueryAST } from '../types/ast';
2
+ /**
3
+ * Serialize a QueryAST to a query string
4
+ */
5
+ export declare function serializeQuery(query: QastNode | QueryAST): string;
6
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAOT,MAAM,cAAc,CAAC;AA6GtB;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAsCjE"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeQuery = serializeQuery;
4
+ const ast_1 = require("../types/ast");
5
+ /**
6
+ * Serialize a value to a string representation
7
+ */
8
+ function serializeValue(value) {
9
+ if (value === null) {
10
+ return 'null';
11
+ }
12
+ if (typeof value === 'boolean') {
13
+ return value.toString();
14
+ }
15
+ if (typeof value === 'number') {
16
+ return value.toString();
17
+ }
18
+ if (typeof value === 'string') {
19
+ // Escape quotes and wrap in quotes
20
+ const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
21
+ return `"${escaped}"`;
22
+ }
23
+ if (Array.isArray(value)) {
24
+ const items = value.map(item => {
25
+ if (typeof item === 'string') {
26
+ const escaped = item.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
27
+ return `"${escaped}"`;
28
+ }
29
+ return item.toString();
30
+ });
31
+ return `[${items.join(',')}]`;
32
+ }
33
+ return String(value);
34
+ }
35
+ /**
36
+ * Serialize a QAST node to a query string
37
+ */
38
+ function serializeNode(node, parentPrecedence = 0) {
39
+ if ((0, ast_1.isComparisonNode)(node)) {
40
+ return serializeComparisonNode(node);
41
+ }
42
+ else if ((0, ast_1.isLogicalNode)(node)) {
43
+ return serializeLogicalNode(node, parentPrecedence);
44
+ }
45
+ else if ((0, ast_1.isNotNode)(node)) {
46
+ return serializeNotNode(node, parentPrecedence);
47
+ }
48
+ else if ((0, ast_1.isBetweenNode)(node)) {
49
+ return serializeBetweenNode(node);
50
+ }
51
+ else if ((0, ast_1.isNullCheckNode)(node)) {
52
+ return serializeNullCheckNode(node);
53
+ }
54
+ throw new Error(`Unknown node type: ${node.type}`);
55
+ }
56
+ /**
57
+ * Serialize a comparison node
58
+ */
59
+ function serializeComparisonNode(node) {
60
+ return `${node.field} ${node.op} ${serializeValue(node.value)}`;
61
+ }
62
+ /**
63
+ * Serialize a logical node
64
+ */
65
+ function serializeLogicalNode(node, parentPrecedence) {
66
+ const op = node.type.toLowerCase();
67
+ const precedence = op === 'and' ? 2 : 1; // AND has higher precedence than OR
68
+ const leftStr = serializeNode(node.left, precedence);
69
+ const rightStr = serializeNode(node.right, precedence);
70
+ const result = `${leftStr} ${op} ${rightStr}`;
71
+ // Add parentheses if needed
72
+ if (parentPrecedence > precedence) {
73
+ return `(${result})`;
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Serialize a NOT node
79
+ */
80
+ function serializeNotNode(node, parentPrecedence) {
81
+ const operandStr = serializeNode(node.operand, 3); // NOT has highest precedence
82
+ const result = `not ${operandStr}`;
83
+ // Add parentheses if needed
84
+ if (parentPrecedence > 0) {
85
+ return `(${result})`;
86
+ }
87
+ return result;
88
+ }
89
+ /**
90
+ * Serialize a BETWEEN node
91
+ */
92
+ function serializeBetweenNode(node) {
93
+ const minStr = serializeValue(node.min);
94
+ const maxStr = serializeValue(node.max);
95
+ return `${node.field} between ${minStr} and ${maxStr}`;
96
+ }
97
+ /**
98
+ * Serialize a NULL_CHECK node
99
+ */
100
+ function serializeNullCheckNode(node) {
101
+ return node.isNull ? `${node.field} isNull` : `${node.field} isNotNull`;
102
+ }
103
+ /**
104
+ * Serialize a QueryAST to a query string
105
+ */
106
+ function serializeQuery(query) {
107
+ let filter;
108
+ let orderBy;
109
+ let limit;
110
+ let offset;
111
+ if ('filter' in query) {
112
+ // It's a QueryAST
113
+ filter = query.filter;
114
+ orderBy = query.orderBy;
115
+ limit = query.limit;
116
+ offset = query.offset;
117
+ }
118
+ else {
119
+ // It's just a QastNode
120
+ filter = query;
121
+ }
122
+ let result = serializeNode(filter);
123
+ // Add orderBy clause
124
+ if (orderBy && orderBy.length > 0) {
125
+ const orderByStr = orderBy
126
+ .map(clause => `${clause.field} ${clause.direction}`)
127
+ .join(', ');
128
+ result += ` orderBy ${orderByStr}`;
129
+ }
130
+ // Add limit clause
131
+ if (limit !== undefined) {
132
+ result += ` limit ${limit}`;
133
+ }
134
+ // Add offset clause
135
+ if (offset !== undefined) {
136
+ result += ` offset ${offset}`;
137
+ }
138
+ return result;
139
+ }
140
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qast",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "Query to AST to ORM - Parse human-readable query strings into AST and transform them into ORM-compatible filters",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -42,7 +42,15 @@
42
42
  "validation",
43
43
  "express",
44
44
  "nextjs",
45
- "nestjs"
45
+ "nestjs",
46
+ "mongoose",
47
+ "knex",
48
+ "drizzle",
49
+ "fastify",
50
+ "hono",
51
+ "query-builder",
52
+ "serialization",
53
+ "caching"
46
54
  ],
47
55
  "author": "https://x.com/hocestnonsatis",
48
56
  "license": "MIT",
@@ -58,14 +66,22 @@
58
66
  "node": ">=14.0.0"
59
67
  },
60
68
  "devDependencies": {
69
+ "@nestjs/common": "^11.1.10",
70
+ "@types/express": "^4.17.25",
61
71
  "@types/jest": "^29.5.0",
62
- "@types/node": "^24.10.1",
72
+ "@types/node": "^25.0.2",
73
+ "fastify": "^4.28.1",
74
+ "hono": "^4.6.11",
63
75
  "jest": "^30.2.0",
64
76
  "ts-jest": "^29.1.0",
77
+ "tslib": "^2.8.1",
65
78
  "typescript": "^5.0.0"
66
79
  },
67
80
  "peerDependencies": {
68
81
  "@prisma/client": "*",
82
+ "drizzle-orm": "*",
83
+ "knex": "*",
84
+ "mongoose": "*",
69
85
  "sequelize": "*",
70
86
  "typeorm": "*"
71
87
  },
@@ -78,7 +94,15 @@
78
94
  },
79
95
  "sequelize": {
80
96
  "optional": true
97
+ },
98
+ "mongoose": {
99
+ "optional": true
100
+ },
101
+ "knex": {
102
+ "optional": true
103
+ },
104
+ "drizzle-orm": {
105
+ "optional": true
81
106
  }
82
- },
83
- "dependencies": {}
107
+ }
84
108
  }