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 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/builder/query-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -10,11 +10,16 @@ export declare class QastError extends Error {
|
|
|
10
10
|
export declare class TokenizationError extends QastError {
|
|
11
11
|
readonly position: number;
|
|
12
12
|
readonly query: string;
|
|
13
|
-
|
|
13
|
+
readonly suggestions?: string[];
|
|
14
|
+
constructor(message: string, position: number, query: string, suggestions?: string[]);
|
|
14
15
|
/**
|
|
15
16
|
* Get a snippet of the query around the error position
|
|
16
17
|
*/
|
|
17
18
|
getSnippet(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get suggestions for fixing the error
|
|
21
|
+
*/
|
|
22
|
+
getSuggestions(): string[];
|
|
18
23
|
}
|
|
19
24
|
/**
|
|
20
25
|
* Error thrown during parsing when the query syntax is invalid
|
|
@@ -22,7 +27,12 @@ export declare class TokenizationError extends QastError {
|
|
|
22
27
|
export declare class ParseError extends QastError {
|
|
23
28
|
readonly position: number;
|
|
24
29
|
readonly query: string;
|
|
25
|
-
|
|
30
|
+
readonly suggestions?: string[];
|
|
31
|
+
constructor(message: string, position?: number, query?: string, suggestions?: string[]);
|
|
32
|
+
/**
|
|
33
|
+
* Get suggestions for fixing the error
|
|
34
|
+
*/
|
|
35
|
+
getSuggestions(): string[];
|
|
26
36
|
}
|
|
27
37
|
/**
|
|
28
38
|
* Error thrown during validation when a field or operator is not allowed
|
|
@@ -30,6 +40,11 @@ export declare class ParseError extends QastError {
|
|
|
30
40
|
export declare class ValidationError extends QastError {
|
|
31
41
|
readonly field?: string;
|
|
32
42
|
readonly operator?: string;
|
|
33
|
-
|
|
43
|
+
readonly suggestions?: string[];
|
|
44
|
+
constructor(message: string, field?: string, operator?: string, suggestions?: string[]);
|
|
45
|
+
/**
|
|
46
|
+
* Get suggestions for fixing the error
|
|
47
|
+
*/
|
|
48
|
+
getSuggestions(): string[];
|
|
34
49
|
}
|
|
35
50
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAO5B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE;IAsBpF;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;CAsB3B;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE;IAqBtF;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;CAsB3B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE;IAkBtF;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;CAyB3B"}
|
package/dist/errors.js
CHANGED
|
@@ -8,7 +8,9 @@ class QastError extends Error {
|
|
|
8
8
|
constructor(message) {
|
|
9
9
|
super(message);
|
|
10
10
|
this.name = this.constructor.name;
|
|
11
|
-
Error.captureStackTrace
|
|
11
|
+
if (typeof Error.captureStackTrace === 'function') {
|
|
12
|
+
Error.captureStackTrace(this, this.constructor);
|
|
13
|
+
}
|
|
12
14
|
}
|
|
13
15
|
}
|
|
14
16
|
exports.QastError = QastError;
|
|
@@ -16,21 +18,64 @@ exports.QastError = QastError;
|
|
|
16
18
|
* Error thrown during tokenization when an invalid token is encountered
|
|
17
19
|
*/
|
|
18
20
|
class TokenizationError extends QastError {
|
|
19
|
-
constructor(message, position, query) {
|
|
20
|
-
|
|
21
|
+
constructor(message, position, query, suggestions) {
|
|
22
|
+
// Generate snippet without using this
|
|
23
|
+
const contextSize = 20;
|
|
24
|
+
const start = Math.max(0, position - contextSize);
|
|
25
|
+
const end = Math.min(query.length, position + contextSize);
|
|
26
|
+
const before = query.substring(start, position);
|
|
27
|
+
const after = query.substring(position, end);
|
|
28
|
+
const lineNumber = query.substring(0, position).split('\n').length;
|
|
29
|
+
const snippet = `Line ${lineNumber}, Column ${position - query.lastIndexOf('\n', position - 1)}\n${before}[ERROR]${after}`;
|
|
30
|
+
const enhancedMessage = `${message} at position ${position}\n${snippet}`;
|
|
31
|
+
if (suggestions && suggestions.length > 0) {
|
|
32
|
+
super(`${enhancedMessage}\nSuggestions: ${suggestions.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
super(enhancedMessage);
|
|
36
|
+
}
|
|
21
37
|
this.position = position;
|
|
22
38
|
this.query = query;
|
|
39
|
+
this.suggestions = suggestions;
|
|
23
40
|
this.name = 'TokenizationError';
|
|
24
41
|
}
|
|
25
42
|
/**
|
|
26
43
|
* Get a snippet of the query around the error position
|
|
27
44
|
*/
|
|
28
45
|
getSnippet() {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
46
|
+
const contextSize = 20;
|
|
47
|
+
const start = Math.max(0, this.position - contextSize);
|
|
48
|
+
const end = Math.min(this.query.length, this.position + contextSize);
|
|
31
49
|
const before = this.query.substring(start, this.position);
|
|
32
50
|
const after = this.query.substring(this.position, end);
|
|
33
|
-
|
|
51
|
+
const lineNumber = this.query.substring(0, this.position).split('\n').length;
|
|
52
|
+
return `Line ${lineNumber}, Column ${this.position - this.query.lastIndexOf('\n', this.position - 1)}\n${before}[ERROR]${after}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get suggestions for fixing the error
|
|
56
|
+
*/
|
|
57
|
+
getSuggestions() {
|
|
58
|
+
if (this.suggestions) {
|
|
59
|
+
return this.suggestions;
|
|
60
|
+
}
|
|
61
|
+
const char = this.query[this.position];
|
|
62
|
+
const suggestions = [];
|
|
63
|
+
if (char === undefined) {
|
|
64
|
+
suggestions.push('Query appears to be incomplete');
|
|
65
|
+
}
|
|
66
|
+
else if (/[{}[\]]/.test(char)) {
|
|
67
|
+
suggestions.push('Unmatched bracket or brace');
|
|
68
|
+
}
|
|
69
|
+
else if (char === '"' || char === "'") {
|
|
70
|
+
suggestions.push('Unterminated string literal - check for matching quotes');
|
|
71
|
+
}
|
|
72
|
+
else if (/\d/.test(char)) {
|
|
73
|
+
suggestions.push('Invalid number format');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
suggestions.push(`Unexpected character: ${char}`);
|
|
77
|
+
}
|
|
78
|
+
return suggestions;
|
|
34
79
|
}
|
|
35
80
|
}
|
|
36
81
|
exports.TokenizationError = TokenizationError;
|
|
@@ -38,24 +83,99 @@ exports.TokenizationError = TokenizationError;
|
|
|
38
83
|
* Error thrown during parsing when the query syntax is invalid
|
|
39
84
|
*/
|
|
40
85
|
class ParseError extends QastError {
|
|
41
|
-
constructor(message, position, query) {
|
|
42
|
-
|
|
86
|
+
constructor(message, position, query, suggestions) {
|
|
87
|
+
let enhancedMessage = message;
|
|
88
|
+
if (position !== undefined && position >= 0 && query) {
|
|
89
|
+
const contextSize = 20;
|
|
90
|
+
const start = Math.max(0, position - contextSize);
|
|
91
|
+
const end = Math.min(query.length, position + contextSize);
|
|
92
|
+
const before = query.substring(start, position);
|
|
93
|
+
const after = query.substring(position, end);
|
|
94
|
+
const lineNumber = query.substring(0, position).split('\n').length;
|
|
95
|
+
enhancedMessage = `${message}\nPosition: ${position} (Line ${lineNumber})\nContext: ${before}[ERROR]${after}`;
|
|
96
|
+
}
|
|
97
|
+
if (suggestions && suggestions.length > 0) {
|
|
98
|
+
enhancedMessage += `\nSuggestions: ${suggestions.join(', ')}`;
|
|
99
|
+
}
|
|
100
|
+
super(enhancedMessage);
|
|
43
101
|
this.position = position ?? -1;
|
|
44
102
|
this.query = query ?? '';
|
|
103
|
+
this.suggestions = suggestions;
|
|
45
104
|
this.name = 'ParseError';
|
|
46
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Get suggestions for fixing the error
|
|
108
|
+
*/
|
|
109
|
+
getSuggestions() {
|
|
110
|
+
if (this.suggestions) {
|
|
111
|
+
return this.suggestions;
|
|
112
|
+
}
|
|
113
|
+
const suggestions = [];
|
|
114
|
+
if (this.message.includes('Expected')) {
|
|
115
|
+
suggestions.push('Check the syntax around the error position');
|
|
116
|
+
suggestions.push('Ensure all parentheses are properly closed');
|
|
117
|
+
suggestions.push('Verify operator syntax (e.g., "eq", "gt", "and")');
|
|
118
|
+
}
|
|
119
|
+
else if (this.message.includes('parenthesis')) {
|
|
120
|
+
suggestions.push('Check for unmatched opening or closing parentheses');
|
|
121
|
+
suggestions.push('Ensure all opening parentheses have matching closing ones');
|
|
122
|
+
}
|
|
123
|
+
else if (this.message.includes('operator')) {
|
|
124
|
+
suggestions.push('Valid operators: eq, ne, gt, lt, gte, lte, in, notIn, contains, startsWith, endsWith, like, regex, matches');
|
|
125
|
+
}
|
|
126
|
+
else if (this.message.includes('Empty query')) {
|
|
127
|
+
suggestions.push('Provide a non-empty query string');
|
|
128
|
+
}
|
|
129
|
+
return suggestions;
|
|
130
|
+
}
|
|
47
131
|
}
|
|
48
132
|
exports.ParseError = ParseError;
|
|
49
133
|
/**
|
|
50
134
|
* Error thrown during validation when a field or operator is not allowed
|
|
51
135
|
*/
|
|
52
136
|
class ValidationError extends QastError {
|
|
53
|
-
constructor(message, field, operator) {
|
|
54
|
-
|
|
137
|
+
constructor(message, field, operator, suggestions) {
|
|
138
|
+
let enhancedMessage = message;
|
|
139
|
+
if (field) {
|
|
140
|
+
enhancedMessage += `\nField: ${field}`;
|
|
141
|
+
}
|
|
142
|
+
if (operator) {
|
|
143
|
+
enhancedMessage += `\nOperator: ${operator}`;
|
|
144
|
+
}
|
|
145
|
+
if (suggestions && suggestions.length > 0) {
|
|
146
|
+
enhancedMessage += `\nSuggestions: ${suggestions.join(', ')}`;
|
|
147
|
+
}
|
|
148
|
+
super(enhancedMessage);
|
|
55
149
|
this.field = field;
|
|
56
150
|
this.operator = operator;
|
|
151
|
+
this.suggestions = suggestions;
|
|
57
152
|
this.name = 'ValidationError';
|
|
58
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Get suggestions for fixing the error
|
|
156
|
+
*/
|
|
157
|
+
getSuggestions() {
|
|
158
|
+
if (this.suggestions) {
|
|
159
|
+
return this.suggestions;
|
|
160
|
+
}
|
|
161
|
+
const suggestions = [];
|
|
162
|
+
if (this.field) {
|
|
163
|
+
suggestions.push(`Field "${this.field}" is not in the allowed fields list`);
|
|
164
|
+
suggestions.push('Check your whitelist configuration');
|
|
165
|
+
}
|
|
166
|
+
if (this.operator) {
|
|
167
|
+
suggestions.push(`Operator "${this.operator}" is not in the allowed operators list`);
|
|
168
|
+
suggestions.push('Check your whitelist configuration');
|
|
169
|
+
}
|
|
170
|
+
if (this.message.includes('complexity')) {
|
|
171
|
+
suggestions.push('Reduce query depth or number of conditions');
|
|
172
|
+
suggestions.push('Check your complexity limit settings');
|
|
173
|
+
}
|
|
174
|
+
if (this.message.includes('length')) {
|
|
175
|
+
suggestions.push('Reduce query string length or array/string value sizes');
|
|
176
|
+
}
|
|
177
|
+
return suggestions;
|
|
178
|
+
}
|
|
59
179
|
}
|
|
60
180
|
exports.ValidationError = ValidationError;
|
|
61
181
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,24 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @packageDocumentation
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* # QAST — Query to AST to ORM
|
|
5
|
+
*
|
|
6
|
+
* A library that parses human-readable query strings into Abstract Syntax Trees (ASTs)
|
|
7
|
+
* and transforms them into ORM-compatible filter objects. ORM-agnostic, type-safe,
|
|
8
|
+
* and designed for secure use in REST APIs.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { parseQuery, toPrismaFilter } from 'qast';
|
|
13
|
+
* const ast = parseQuery('age gt 25 and name eq "John"');
|
|
14
|
+
* const filter = toPrismaFilter(ast);
|
|
15
|
+
* await prisma.user.findMany(filter);
|
|
16
|
+
* ```
|
|
6
17
|
*/
|
|
7
|
-
export { parseQueryString } from './parser/parser';
|
|
18
|
+
export { parseQueryString, parseQueryStringFilter } from './parser/parser';
|
|
8
19
|
export { Tokenizer, Token, TokenType } from './parser/tokenizer';
|
|
9
20
|
export { validateQuery, validateQueryComplexity, extractFields, extractOperators, } from './parser/validator';
|
|
10
21
|
export { toPrismaFilter, PrismaFilter } from './adapters/prisma';
|
|
11
|
-
export { toTypeORMFilter, TypeORMFilter } from './adapters/typeorm';
|
|
12
|
-
export { toSequelizeFilter, SequelizeFilter } from './adapters/sequelize';
|
|
13
|
-
export {
|
|
22
|
+
export { toTypeORMFilter, TypeORMFilter, transformTypeORMOperators } from './adapters/typeorm';
|
|
23
|
+
export { toSequelizeFilter, SequelizeFilter, transformSequelizeOperators } from './adapters/sequelize';
|
|
24
|
+
export { toMongooseFilter, MongooseFilter } from './adapters/mongoose';
|
|
25
|
+
export { toKnexFilter, KnexFilter, KnexQueryCallback } from './adapters/knex';
|
|
26
|
+
export { toDrizzleFilter, DrizzleFilter, transformDrizzleConditions } from './adapters/drizzle';
|
|
27
|
+
export { QastNode, ComparisonNode, LogicalNode, NotNode, BetweenNode, NullCheckNode, LogicalOperator, Operator, QastValue, ParseOptions, WhitelistOptions, ComplexityOptions, QueryAST, OrderByClause, SortDirection, isComparisonNode, isLogicalNode, isNotNode, isBetweenNode, isNullCheckNode, } from './types/ast';
|
|
14
28
|
export { QastError, ParseError, ValidationError, TokenizationError, } from './errors';
|
|
15
|
-
|
|
29
|
+
export { QueryBuilder, FieldBuilder, queryBuilder } from './builder/query-builder';
|
|
30
|
+
export { serializeQuery } from './utils/serializer';
|
|
31
|
+
export { cloneAST, mergeQueries, optimizeAST, getQueryStats, diffQueries, QueryStats, QueryDiff, } from './utils/ast-utils';
|
|
32
|
+
export { QueryCache, memoizeQuery, createCachedParser } from './utils/cache';
|
|
33
|
+
export { sanitizeFieldName, estimateQueryCost, RateLimiter, QueryCost, } from './parser/validator';
|
|
34
|
+
export { qastExpressMiddleware, QastRequest } from './integrations/express';
|
|
35
|
+
export { QastPipe, QastFullPipe, QastQuery } from './integrations/nestjs';
|
|
36
|
+
export { qastPlugin as qastFastifyPlugin, QastFastifyRequest } from './integrations/fastify';
|
|
37
|
+
export { qastMiddleware as qastHonoMiddleware, QastContext } from './integrations/hono';
|
|
38
|
+
import { ParseOptions, QastNode, QueryAST } from './types/ast';
|
|
16
39
|
/**
|
|
17
|
-
*
|
|
40
|
+
* Field schema type for type-safe field access
|
|
41
|
+
*/
|
|
42
|
+
export interface FieldSchema {
|
|
43
|
+
[field: string]: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'null';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Type-safe parse options
|
|
47
|
+
*/
|
|
48
|
+
export interface TypedParseOptions<T extends FieldSchema = FieldSchema> extends ParseOptions {
|
|
49
|
+
/**
|
|
50
|
+
* Field schema for type checking (optional, for type inference only)
|
|
51
|
+
*/
|
|
52
|
+
schema?: T;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse a query string into an AST (backward compatible - returns only filter)
|
|
18
56
|
*
|
|
19
57
|
* @param query - The query string to parse (e.g., 'age gt 25 and name eq "John"')
|
|
20
58
|
* @param options - Optional parsing options (whitelisting, validation, complexity limits)
|
|
21
|
-
* @returns The parsed AST node
|
|
59
|
+
* @returns The parsed AST node (filter only)
|
|
22
60
|
*
|
|
23
61
|
* @example
|
|
24
62
|
* ```ts
|
|
@@ -38,6 +76,34 @@ import { ParseOptions, QastNode } from './types/ast';
|
|
|
38
76
|
* maxStringLength: 200,
|
|
39
77
|
* });
|
|
40
78
|
* ```
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* // Type-safe parsing with schema
|
|
83
|
+
* interface UserSchema extends FieldSchema {
|
|
84
|
+
* age: 'number';
|
|
85
|
+
* name: 'string';
|
|
86
|
+
* active: 'boolean';
|
|
87
|
+
* }
|
|
88
|
+
*
|
|
89
|
+
* const ast = parseQuery<UserSchema>('age gt 25', {
|
|
90
|
+
* allowedFields: ['age', 'name', 'active'],
|
|
91
|
+
* schema: { age: 'number', name: 'string', active: 'boolean' }
|
|
92
|
+
* });
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function parseQuery<T extends FieldSchema = FieldSchema>(query: string, options?: TypedParseOptions<T>): QastNode;
|
|
96
|
+
/**
|
|
97
|
+
* Parses a query string into a full QueryAST (filter, sorting, pagination).
|
|
98
|
+
*
|
|
99
|
+
* @param query - Query string (e.g. `age gt 25 orderBy age desc limit 10`)
|
|
100
|
+
* @param options - Optional parsing options (whitelists, validation, complexity limits)
|
|
101
|
+
* @returns QueryAST with `filter`, `orderBy`, `limit`, and `offset`
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* const q = parseQueryFull('age gt 25 orderBy age desc limit 10 offset 20');
|
|
105
|
+
* // q.filter, q.orderBy, q.limit, q.offset
|
|
106
|
+
* ```
|
|
41
107
|
*/
|
|
42
|
-
export declare function
|
|
108
|
+
export declare function parseQueryFull<T extends FieldSchema = FieldSchema>(query: string, options?: TypedParseOptions<T>): QueryAST;
|
|
43
109
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,52 +1,129 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* @packageDocumentation
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* # QAST — Query to AST to ORM
|
|
6
|
+
*
|
|
7
|
+
* A library that parses human-readable query strings into Abstract Syntax Trees (ASTs)
|
|
8
|
+
* and transforms them into ORM-compatible filter objects. ORM-agnostic, type-safe,
|
|
9
|
+
* and designed for secure use in REST APIs.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { parseQuery, toPrismaFilter } from 'qast';
|
|
14
|
+
* const ast = parseQuery('age gt 25 and name eq "John"');
|
|
15
|
+
* const filter = toPrismaFilter(ast);
|
|
16
|
+
* await prisma.user.findMany(filter);
|
|
17
|
+
* ```
|
|
7
18
|
*/
|
|
8
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.TokenizationError = exports.ValidationError = exports.ParseError = exports.QastError = exports.isLogicalNode = exports.isComparisonNode = exports.toSequelizeFilter = exports.toTypeORMFilter = exports.toPrismaFilter = exports.extractOperators = exports.extractFields = exports.validateQueryComplexity = exports.validateQuery = exports.TokenType = exports.Tokenizer = exports.parseQueryString = void 0;
|
|
20
|
+
exports.qastHonoMiddleware = exports.qastFastifyPlugin = exports.QastQuery = exports.QastFullPipe = exports.QastPipe = exports.qastExpressMiddleware = exports.RateLimiter = exports.estimateQueryCost = exports.sanitizeFieldName = exports.createCachedParser = exports.memoizeQuery = exports.QueryCache = exports.diffQueries = exports.getQueryStats = exports.optimizeAST = exports.mergeQueries = exports.cloneAST = exports.serializeQuery = exports.queryBuilder = exports.FieldBuilder = exports.QueryBuilder = exports.TokenizationError = exports.ValidationError = exports.ParseError = exports.QastError = exports.isNullCheckNode = exports.isBetweenNode = exports.isNotNode = exports.isLogicalNode = exports.isComparisonNode = exports.transformDrizzleConditions = exports.toDrizzleFilter = exports.toKnexFilter = exports.toMongooseFilter = exports.transformSequelizeOperators = exports.toSequelizeFilter = exports.transformTypeORMOperators = exports.toTypeORMFilter = exports.toPrismaFilter = exports.extractOperators = exports.extractFields = exports.validateQueryComplexity = exports.validateQuery = exports.TokenType = exports.Tokenizer = exports.parseQueryStringFilter = exports.parseQueryString = void 0;
|
|
10
21
|
exports.parseQuery = parseQuery;
|
|
11
|
-
|
|
22
|
+
exports.parseQueryFull = parseQueryFull;
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Parser & tokenizer
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
12
26
|
var parser_1 = require("./parser/parser");
|
|
13
27
|
Object.defineProperty(exports, "parseQueryString", { enumerable: true, get: function () { return parser_1.parseQueryString; } });
|
|
28
|
+
Object.defineProperty(exports, "parseQueryStringFilter", { enumerable: true, get: function () { return parser_1.parseQueryStringFilter; } });
|
|
14
29
|
var tokenizer_1 = require("./parser/tokenizer");
|
|
15
30
|
Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return tokenizer_1.Tokenizer; } });
|
|
16
31
|
Object.defineProperty(exports, "TokenType", { enumerable: true, get: function () { return tokenizer_1.TokenType; } });
|
|
17
|
-
//
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Validation
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
18
35
|
var validator_1 = require("./parser/validator");
|
|
19
36
|
Object.defineProperty(exports, "validateQuery", { enumerable: true, get: function () { return validator_1.validateQuery; } });
|
|
20
37
|
Object.defineProperty(exports, "validateQueryComplexity", { enumerable: true, get: function () { return validator_1.validateQueryComplexity; } });
|
|
21
38
|
Object.defineProperty(exports, "extractFields", { enumerable: true, get: function () { return validator_1.extractFields; } });
|
|
22
39
|
Object.defineProperty(exports, "extractOperators", { enumerable: true, get: function () { return validator_1.extractOperators; } });
|
|
23
|
-
//
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// ORM adapters
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
24
43
|
var prisma_1 = require("./adapters/prisma");
|
|
25
44
|
Object.defineProperty(exports, "toPrismaFilter", { enumerable: true, get: function () { return prisma_1.toPrismaFilter; } });
|
|
26
45
|
var typeorm_1 = require("./adapters/typeorm");
|
|
27
46
|
Object.defineProperty(exports, "toTypeORMFilter", { enumerable: true, get: function () { return typeorm_1.toTypeORMFilter; } });
|
|
47
|
+
Object.defineProperty(exports, "transformTypeORMOperators", { enumerable: true, get: function () { return typeorm_1.transformTypeORMOperators; } });
|
|
28
48
|
var sequelize_1 = require("./adapters/sequelize");
|
|
29
49
|
Object.defineProperty(exports, "toSequelizeFilter", { enumerable: true, get: function () { return sequelize_1.toSequelizeFilter; } });
|
|
30
|
-
|
|
50
|
+
Object.defineProperty(exports, "transformSequelizeOperators", { enumerable: true, get: function () { return sequelize_1.transformSequelizeOperators; } });
|
|
51
|
+
var mongoose_1 = require("./adapters/mongoose");
|
|
52
|
+
Object.defineProperty(exports, "toMongooseFilter", { enumerable: true, get: function () { return mongoose_1.toMongooseFilter; } });
|
|
53
|
+
var knex_1 = require("./adapters/knex");
|
|
54
|
+
Object.defineProperty(exports, "toKnexFilter", { enumerable: true, get: function () { return knex_1.toKnexFilter; } });
|
|
55
|
+
var drizzle_1 = require("./adapters/drizzle");
|
|
56
|
+
Object.defineProperty(exports, "toDrizzleFilter", { enumerable: true, get: function () { return drizzle_1.toDrizzleFilter; } });
|
|
57
|
+
Object.defineProperty(exports, "transformDrizzleConditions", { enumerable: true, get: function () { return drizzle_1.transformDrizzleConditions; } });
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Types
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
31
61
|
var ast_1 = require("./types/ast");
|
|
32
62
|
Object.defineProperty(exports, "isComparisonNode", { enumerable: true, get: function () { return ast_1.isComparisonNode; } });
|
|
33
63
|
Object.defineProperty(exports, "isLogicalNode", { enumerable: true, get: function () { return ast_1.isLogicalNode; } });
|
|
34
|
-
|
|
64
|
+
Object.defineProperty(exports, "isNotNode", { enumerable: true, get: function () { return ast_1.isNotNode; } });
|
|
65
|
+
Object.defineProperty(exports, "isBetweenNode", { enumerable: true, get: function () { return ast_1.isBetweenNode; } });
|
|
66
|
+
Object.defineProperty(exports, "isNullCheckNode", { enumerable: true, get: function () { return ast_1.isNullCheckNode; } });
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Errors
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
35
70
|
var errors_1 = require("./errors");
|
|
36
71
|
Object.defineProperty(exports, "QastError", { enumerable: true, get: function () { return errors_1.QastError; } });
|
|
37
72
|
Object.defineProperty(exports, "ParseError", { enumerable: true, get: function () { return errors_1.ParseError; } });
|
|
38
73
|
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
|
|
39
74
|
Object.defineProperty(exports, "TokenizationError", { enumerable: true, get: function () { return errors_1.TokenizationError; } });
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Query builder
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
var query_builder_1 = require("./builder/query-builder");
|
|
79
|
+
Object.defineProperty(exports, "QueryBuilder", { enumerable: true, get: function () { return query_builder_1.QueryBuilder; } });
|
|
80
|
+
Object.defineProperty(exports, "FieldBuilder", { enumerable: true, get: function () { return query_builder_1.FieldBuilder; } });
|
|
81
|
+
Object.defineProperty(exports, "queryBuilder", { enumerable: true, get: function () { return query_builder_1.queryBuilder; } });
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Utilities
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
var serializer_1 = require("./utils/serializer");
|
|
86
|
+
Object.defineProperty(exports, "serializeQuery", { enumerable: true, get: function () { return serializer_1.serializeQuery; } });
|
|
87
|
+
var ast_utils_1 = require("./utils/ast-utils");
|
|
88
|
+
Object.defineProperty(exports, "cloneAST", { enumerable: true, get: function () { return ast_utils_1.cloneAST; } });
|
|
89
|
+
Object.defineProperty(exports, "mergeQueries", { enumerable: true, get: function () { return ast_utils_1.mergeQueries; } });
|
|
90
|
+
Object.defineProperty(exports, "optimizeAST", { enumerable: true, get: function () { return ast_utils_1.optimizeAST; } });
|
|
91
|
+
Object.defineProperty(exports, "getQueryStats", { enumerable: true, get: function () { return ast_utils_1.getQueryStats; } });
|
|
92
|
+
Object.defineProperty(exports, "diffQueries", { enumerable: true, get: function () { return ast_utils_1.diffQueries; } });
|
|
93
|
+
var cache_1 = require("./utils/cache");
|
|
94
|
+
Object.defineProperty(exports, "QueryCache", { enumerable: true, get: function () { return cache_1.QueryCache; } });
|
|
95
|
+
Object.defineProperty(exports, "memoizeQuery", { enumerable: true, get: function () { return cache_1.memoizeQuery; } });
|
|
96
|
+
Object.defineProperty(exports, "createCachedParser", { enumerable: true, get: function () { return cache_1.createCachedParser; } });
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Security
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
var validator_2 = require("./parser/validator");
|
|
101
|
+
Object.defineProperty(exports, "sanitizeFieldName", { enumerable: true, get: function () { return validator_2.sanitizeFieldName; } });
|
|
102
|
+
Object.defineProperty(exports, "estimateQueryCost", { enumerable: true, get: function () { return validator_2.estimateQueryCost; } });
|
|
103
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return validator_2.RateLimiter; } });
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Framework integrations
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
var express_1 = require("./integrations/express");
|
|
108
|
+
Object.defineProperty(exports, "qastExpressMiddleware", { enumerable: true, get: function () { return express_1.qastExpressMiddleware; } });
|
|
109
|
+
var nestjs_1 = require("./integrations/nestjs");
|
|
110
|
+
Object.defineProperty(exports, "QastPipe", { enumerable: true, get: function () { return nestjs_1.QastPipe; } });
|
|
111
|
+
Object.defineProperty(exports, "QastFullPipe", { enumerable: true, get: function () { return nestjs_1.QastFullPipe; } });
|
|
112
|
+
Object.defineProperty(exports, "QastQuery", { enumerable: true, get: function () { return nestjs_1.QastQuery; } });
|
|
113
|
+
var fastify_1 = require("./integrations/fastify");
|
|
114
|
+
Object.defineProperty(exports, "qastFastifyPlugin", { enumerable: true, get: function () { return fastify_1.qastPlugin; } });
|
|
115
|
+
var hono_1 = require("./integrations/hono");
|
|
116
|
+
Object.defineProperty(exports, "qastHonoMiddleware", { enumerable: true, get: function () { return hono_1.qastMiddleware; } });
|
|
40
117
|
// Main parse function with options
|
|
41
118
|
const parser_2 = require("./parser/parser");
|
|
42
|
-
const
|
|
119
|
+
const validator_3 = require("./parser/validator");
|
|
43
120
|
const errors_2 = require("./errors");
|
|
44
121
|
/**
|
|
45
|
-
* Parse a query string into an AST
|
|
122
|
+
* Parse a query string into an AST (backward compatible - returns only filter)
|
|
46
123
|
*
|
|
47
124
|
* @param query - The query string to parse (e.g., 'age gt 25 and name eq "John"')
|
|
48
125
|
* @param options - Optional parsing options (whitelisting, validation, complexity limits)
|
|
49
|
-
* @returns The parsed AST node
|
|
126
|
+
* @returns The parsed AST node (filter only)
|
|
50
127
|
*
|
|
51
128
|
* @example
|
|
52
129
|
* ```ts
|
|
@@ -66,13 +143,44 @@ const errors_2 = require("./errors");
|
|
|
66
143
|
* maxStringLength: 200,
|
|
67
144
|
* });
|
|
68
145
|
* ```
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* // Type-safe parsing with schema
|
|
150
|
+
* interface UserSchema extends FieldSchema {
|
|
151
|
+
* age: 'number';
|
|
152
|
+
* name: 'string';
|
|
153
|
+
* active: 'boolean';
|
|
154
|
+
* }
|
|
155
|
+
*
|
|
156
|
+
* const ast = parseQuery<UserSchema>('age gt 25', {
|
|
157
|
+
* allowedFields: ['age', 'name', 'active'],
|
|
158
|
+
* schema: { age: 'number', name: 'string', active: 'boolean' }
|
|
159
|
+
* });
|
|
160
|
+
* ```
|
|
69
161
|
*/
|
|
70
162
|
function parseQuery(query, options) {
|
|
163
|
+
const queryAST = parseQueryFull(query, options);
|
|
164
|
+
return queryAST.filter;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Parses a query string into a full QueryAST (filter, sorting, pagination).
|
|
168
|
+
*
|
|
169
|
+
* @param query - Query string (e.g. `age gt 25 orderBy age desc limit 10`)
|
|
170
|
+
* @param options - Optional parsing options (whitelists, validation, complexity limits)
|
|
171
|
+
* @returns QueryAST with `filter`, `orderBy`, `limit`, and `offset`
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* const q = parseQueryFull('age gt 25 orderBy age desc limit 10 offset 20');
|
|
175
|
+
* // q.filter, q.orderBy, q.limit, q.offset
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
function parseQueryFull(query, options) {
|
|
71
179
|
// Check query string length before parsing (early rejection)
|
|
72
180
|
if (options?.maxQueryLength !== undefined && query.length > options.maxQueryLength) {
|
|
73
181
|
throw new errors_2.ValidationError(`Query string is too long (${query.length} characters) - maximum allowed is ${options.maxQueryLength}`);
|
|
74
182
|
}
|
|
75
|
-
const
|
|
183
|
+
const queryAST = (0, parser_2.parseQueryString)(query);
|
|
76
184
|
if (options) {
|
|
77
185
|
// Validate against whitelists if enabled
|
|
78
186
|
if (options.validate !== false) {
|
|
@@ -82,7 +190,7 @@ function parseQuery(query, options) {
|
|
|
82
190
|
};
|
|
83
191
|
// Only validate if whitelists are provided
|
|
84
192
|
if (whitelist.allowedFields || whitelist.allowedOperators) {
|
|
85
|
-
(0,
|
|
193
|
+
(0, validator_3.validateQuery)(queryAST.filter, whitelist);
|
|
86
194
|
}
|
|
87
195
|
}
|
|
88
196
|
// Enforce complexity limits if configured
|
|
@@ -91,7 +199,7 @@ function parseQuery(query, options) {
|
|
|
91
199
|
options.maxArrayLength !== undefined ||
|
|
92
200
|
options.maxStringLength !== undefined;
|
|
93
201
|
if (hasComplexityLimits) {
|
|
94
|
-
(0,
|
|
202
|
+
(0, validator_3.validateQueryComplexity)(queryAST.filter, {
|
|
95
203
|
maxDepth: options.maxDepth,
|
|
96
204
|
maxNodes: options.maxNodes,
|
|
97
205
|
maxArrayLength: options.maxArrayLength,
|
|
@@ -99,6 +207,6 @@ function parseQuery(query, options) {
|
|
|
99
207
|
});
|
|
100
208
|
}
|
|
101
209
|
}
|
|
102
|
-
return
|
|
210
|
+
return queryAST;
|
|
103
211
|
}
|
|
104
212
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { ParseOptions, QueryAST, QastNode } from '../index';
|
|
3
|
+
/**
|
|
4
|
+
* Express request with parsed QAST filter
|
|
5
|
+
*/
|
|
6
|
+
export interface QastRequest extends Request {
|
|
7
|
+
qastFilter?: QastNode;
|
|
8
|
+
qastQuery?: QueryAST;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Express middleware for parsing QAST queries
|
|
12
|
+
*/
|
|
13
|
+
export declare function qastExpressMiddleware(options?: ParseOptions): (req: Request, res: Response, next: NextFunction) => void;
|
|
14
|
+
//# sourceMappingURL=express.d.ts.map
|