qast 1.1.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 +312 -6
- 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 +90 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -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 +44 -1
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +210 -2
- package/dist/parser/validator.js.map +1 -1
- package/dist/types/ast.d.ts +102 -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 +31 -8
package/dist/parser/tokenizer.js
CHANGED
|
@@ -16,16 +16,57 @@ var TokenType;
|
|
|
16
16
|
TokenType["BRACKET_OPEN"] = "BRACKET_OPEN";
|
|
17
17
|
TokenType["BRACKET_CLOSE"] = "BRACKET_CLOSE";
|
|
18
18
|
TokenType["COMMA"] = "COMMA";
|
|
19
|
+
TokenType["NOT"] = "NOT";
|
|
20
|
+
TokenType["BETWEEN"] = "BETWEEN";
|
|
21
|
+
TokenType["AND_KEYWORD"] = "AND_KEYWORD";
|
|
22
|
+
TokenType["IS_NULL"] = "IS_NULL";
|
|
23
|
+
TokenType["IS_NOT_NULL"] = "IS_NOT_NULL";
|
|
24
|
+
TokenType["ORDER_BY"] = "ORDER_BY";
|
|
25
|
+
TokenType["LIMIT"] = "LIMIT";
|
|
26
|
+
TokenType["OFFSET"] = "OFFSET";
|
|
27
|
+
TokenType["ASC"] = "ASC";
|
|
28
|
+
TokenType["DESC"] = "DESC";
|
|
19
29
|
TokenType["EOF"] = "EOF";
|
|
20
30
|
})(TokenType || (exports.TokenType = TokenType = {}));
|
|
21
31
|
/**
|
|
22
|
-
* Supported operators
|
|
32
|
+
* Supported operators (ordered by length to match longer operators first)
|
|
23
33
|
*/
|
|
24
|
-
const OPERATORS = [
|
|
34
|
+
const OPERATORS = [
|
|
35
|
+
'startsWith',
|
|
36
|
+
'endsWith',
|
|
37
|
+
'notIn',
|
|
38
|
+
'contains',
|
|
39
|
+
'matches',
|
|
40
|
+
'regex',
|
|
41
|
+
'like',
|
|
42
|
+
'gte',
|
|
43
|
+
'lte',
|
|
44
|
+
'eq',
|
|
45
|
+
'ne',
|
|
46
|
+
'gt',
|
|
47
|
+
'lt',
|
|
48
|
+
'in',
|
|
49
|
+
];
|
|
25
50
|
/**
|
|
26
51
|
* Logical operators
|
|
27
52
|
*/
|
|
28
53
|
const LOGICAL_OPS = ['and', 'or'];
|
|
54
|
+
/**
|
|
55
|
+
* Keywords that need special handling
|
|
56
|
+
*/
|
|
57
|
+
const KEYWORDS = {
|
|
58
|
+
not: TokenType.NOT,
|
|
59
|
+
between: TokenType.BETWEEN,
|
|
60
|
+
and: TokenType.AND_KEYWORD,
|
|
61
|
+
orderBy: TokenType.ORDER_BY,
|
|
62
|
+
'order-by': TokenType.ORDER_BY,
|
|
63
|
+
limit: TokenType.LIMIT,
|
|
64
|
+
offset: TokenType.OFFSET,
|
|
65
|
+
asc: TokenType.ASC,
|
|
66
|
+
desc: TokenType.DESC,
|
|
67
|
+
isNull: TokenType.IS_NULL,
|
|
68
|
+
isNotNull: TokenType.IS_NOT_NULL,
|
|
69
|
+
};
|
|
29
70
|
/**
|
|
30
71
|
* Tokenizer for QAST query strings
|
|
31
72
|
*/
|
|
@@ -65,12 +106,12 @@ class Tokenizer {
|
|
|
65
106
|
return this.input[this.position + 1];
|
|
66
107
|
}
|
|
67
108
|
/**
|
|
68
|
-
* Read an identifier (field name)
|
|
109
|
+
* Read an identifier (field name, supports nested fields with dots)
|
|
69
110
|
*/
|
|
70
111
|
readIdentifier() {
|
|
71
112
|
const start = this.position;
|
|
72
113
|
while (this.currentChar !== null &&
|
|
73
|
-
(/\w/.test(this.currentChar) || this.currentChar === '_')) {
|
|
114
|
+
(/\w/.test(this.currentChar) || this.currentChar === '_' || this.currentChar === '.')) {
|
|
74
115
|
this.advance();
|
|
75
116
|
}
|
|
76
117
|
return this.input.substring(start, this.position);
|
|
@@ -239,22 +280,38 @@ class Tokenizer {
|
|
|
239
280
|
};
|
|
240
281
|
}
|
|
241
282
|
const position = this.position;
|
|
242
|
-
// Check for operators (
|
|
243
|
-
|
|
283
|
+
// Check for operators first (before keywords to avoid conflicts like "not" vs "notIn")
|
|
284
|
+
// Operators are checked first because they are more specific (longer matches)
|
|
285
|
+
const peekAhead = this.input.substring(this.position).toLowerCase();
|
|
244
286
|
for (const op of OPERATORS) {
|
|
245
|
-
|
|
246
|
-
|
|
287
|
+
const opLower = op.toLowerCase();
|
|
288
|
+
if (peekAhead.startsWith(opLower) && !/\w/.test(peekAhead[opLower.length] ?? '')) {
|
|
289
|
+
// Advance by the actual operator length in the input (case-insensitive match)
|
|
290
|
+
this.position += opLower.length;
|
|
247
291
|
this.currentChar = this.position < this.input.length ? this.input[this.position] : null;
|
|
248
292
|
return {
|
|
249
293
|
type: TokenType.OPERATOR,
|
|
250
|
-
value: op,
|
|
294
|
+
value: op, // Return the canonical operator name from OPERATORS array
|
|
295
|
+
position,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Check for keywords (after operators to avoid conflicts)
|
|
300
|
+
for (const [keyword, tokenType] of Object.entries(KEYWORDS)) {
|
|
301
|
+
const keywordLower = keyword.toLowerCase();
|
|
302
|
+
if (peekAhead.startsWith(keywordLower) && !/\w/.test(this.input[this.position + keywordLower.length] ?? '')) {
|
|
303
|
+
this.position += keywordLower.length;
|
|
304
|
+
this.currentChar = this.position < this.input.length ? this.input[this.position] : null;
|
|
305
|
+
return {
|
|
306
|
+
type: tokenType,
|
|
307
|
+
value: keyword,
|
|
251
308
|
position,
|
|
252
309
|
};
|
|
253
310
|
}
|
|
254
311
|
}
|
|
255
312
|
// Check for logical operators
|
|
256
313
|
for (const logicalOp of LOGICAL_OPS) {
|
|
257
|
-
if (peekAhead.
|
|
314
|
+
if (peekAhead.startsWith(logicalOp) && !/\w/.test(peekAhead[logicalOp.length] ?? '')) {
|
|
258
315
|
this.position += logicalOp.length;
|
|
259
316
|
this.currentChar = this.position < this.input.length ? this.input[this.position] : null;
|
|
260
317
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { QastNode, WhitelistOptions, Operator } from '../types/ast';
|
|
1
|
+
import { QastNode, WhitelistOptions, ComplexityOptions, Operator } from '../types/ast';
|
|
2
2
|
/**
|
|
3
3
|
* Validate an AST against whitelist options
|
|
4
4
|
*/
|
|
5
5
|
export declare function validateQuery(ast: QastNode, whitelist: WhitelistOptions): void;
|
|
6
|
+
/**
|
|
7
|
+
* Validate query complexity (depth, node count, array lengths, string lengths)
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateQueryComplexity(ast: QastNode, options: ComplexityOptions): void;
|
|
6
10
|
/**
|
|
7
11
|
* Extract all fields used in an AST
|
|
8
12
|
*/
|
|
@@ -11,4 +15,43 @@ export declare function extractFields(ast: QastNode): string[];
|
|
|
11
15
|
* Extract all operators used in an AST
|
|
12
16
|
*/
|
|
13
17
|
export declare function extractOperators(ast: QastNode): Operator[];
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize field name to prevent injection attacks
|
|
20
|
+
*/
|
|
21
|
+
export declare function sanitizeFieldName(field: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Query cost estimation
|
|
24
|
+
*/
|
|
25
|
+
export interface QueryCost {
|
|
26
|
+
estimatedComplexity: number;
|
|
27
|
+
depth: number;
|
|
28
|
+
nodeCount: number;
|
|
29
|
+
fieldCount: number;
|
|
30
|
+
operatorCount: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Estimate query cost for rate limiting and resource management
|
|
34
|
+
*/
|
|
35
|
+
export declare function estimateQueryCost(ast: QastNode): QueryCost;
|
|
36
|
+
/**
|
|
37
|
+
* Rate limiting helper - simple in-memory rate limiter
|
|
38
|
+
*/
|
|
39
|
+
export declare class RateLimiter {
|
|
40
|
+
private requests;
|
|
41
|
+
private windowMs;
|
|
42
|
+
private maxRequests;
|
|
43
|
+
constructor(maxRequests?: number, windowMs?: number);
|
|
44
|
+
/**
|
|
45
|
+
* Check if request is allowed
|
|
46
|
+
*/
|
|
47
|
+
isAllowed(identifier: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Reset rate limiter for an identifier
|
|
50
|
+
*/
|
|
51
|
+
reset(identifier: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Clear all rate limit data
|
|
54
|
+
*/
|
|
55
|
+
clear(): void;
|
|
56
|
+
}
|
|
14
57
|
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/parser/validator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/parser/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACT,MAAM,cAAc,CAAC;AAUtB;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAE9E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAmBvF;AAuKD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,EAAE,CAIrD;AAoBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAI1D;AA8CD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CAe1D;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAY,EAAE,QAAQ,GAAE,MAAc;IAM/D;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAkBtC;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/parser/validator.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RateLimiter = void 0;
|
|
3
4
|
exports.validateQuery = validateQuery;
|
|
5
|
+
exports.validateQueryComplexity = validateQueryComplexity;
|
|
4
6
|
exports.extractFields = extractFields;
|
|
5
7
|
exports.extractOperators = extractOperators;
|
|
8
|
+
exports.sanitizeFieldName = sanitizeFieldName;
|
|
9
|
+
exports.estimateQueryCost = estimateQueryCost;
|
|
6
10
|
const errors_1 = require("../errors");
|
|
7
11
|
const ast_1 = require("../types/ast");
|
|
8
12
|
/**
|
|
@@ -11,6 +15,69 @@ const ast_1 = require("../types/ast");
|
|
|
11
15
|
function validateQuery(ast, whitelist) {
|
|
12
16
|
validateNode(ast, whitelist);
|
|
13
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate query complexity (depth, node count, array lengths, string lengths)
|
|
20
|
+
*/
|
|
21
|
+
function validateQueryComplexity(ast, options) {
|
|
22
|
+
const { depth, nodes } = computeComplexity(ast);
|
|
23
|
+
if (options.maxDepth !== undefined && depth > options.maxDepth) {
|
|
24
|
+
throw new errors_1.ValidationError(`Query is too deeply nested (depth ${depth}) - maximum allowed depth is ${options.maxDepth}`);
|
|
25
|
+
}
|
|
26
|
+
if (options.maxNodes !== undefined && nodes > options.maxNodes) {
|
|
27
|
+
throw new errors_1.ValidationError(`Query is too complex (node count ${nodes}) - maximum allowed nodes is ${options.maxNodes}`);
|
|
28
|
+
}
|
|
29
|
+
// Validate array and string lengths in values
|
|
30
|
+
if (options.maxArrayLength !== undefined || options.maxStringLength !== undefined) {
|
|
31
|
+
validateValueLimits(ast, options);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Recursively validate value limits (array lengths, string lengths)
|
|
36
|
+
*/
|
|
37
|
+
function validateValueLimits(node, options) {
|
|
38
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
39
|
+
const { value, field } = node;
|
|
40
|
+
// Check array length
|
|
41
|
+
if (options.maxArrayLength !== undefined && Array.isArray(value)) {
|
|
42
|
+
if (value.length > options.maxArrayLength) {
|
|
43
|
+
throw new errors_1.ValidationError(`Array value for field '${field}' has ${value.length} items - maximum allowed is ${options.maxArrayLength}`, field);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Check string length
|
|
47
|
+
if (options.maxStringLength !== undefined && typeof value === 'string') {
|
|
48
|
+
if (value.length > options.maxStringLength) {
|
|
49
|
+
throw new errors_1.ValidationError(`String value for field '${field}' has ${value.length} characters - maximum allowed is ${options.maxStringLength}`, field);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check string lengths inside arrays
|
|
53
|
+
if (options.maxStringLength !== undefined && Array.isArray(value)) {
|
|
54
|
+
for (const item of value) {
|
|
55
|
+
if (typeof item === 'string' && item.length > options.maxStringLength) {
|
|
56
|
+
throw new errors_1.ValidationError(`String value in array for field '${field}' has ${item.length} characters - maximum allowed is ${options.maxStringLength}`, field);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
62
|
+
validateValueLimits(node.left, options);
|
|
63
|
+
validateValueLimits(node.right, options);
|
|
64
|
+
}
|
|
65
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
66
|
+
validateValueLimits(node.operand, options);
|
|
67
|
+
}
|
|
68
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
69
|
+
// Validate between values
|
|
70
|
+
if (options.maxStringLength !== undefined) {
|
|
71
|
+
if (typeof node.min === 'string' && node.min.length > options.maxStringLength) {
|
|
72
|
+
throw new errors_1.ValidationError(`String value for field '${node.field}' in between clause has ${node.min.length} characters - maximum allowed is ${options.maxStringLength}`, node.field);
|
|
73
|
+
}
|
|
74
|
+
if (typeof node.max === 'string' && node.max.length > options.maxStringLength) {
|
|
75
|
+
throw new errors_1.ValidationError(`String value for field '${node.field}' in between clause has ${node.max.length} characters - maximum allowed is ${options.maxStringLength}`, node.field);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// NullCheckNode has no values to validate
|
|
80
|
+
}
|
|
14
81
|
/**
|
|
15
82
|
* Recursively validate a node
|
|
16
83
|
*/
|
|
@@ -21,6 +88,15 @@ function validateNode(node, whitelist) {
|
|
|
21
88
|
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
22
89
|
validateLogicalNode(node, whitelist);
|
|
23
90
|
}
|
|
91
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
92
|
+
validateNotNode(node, whitelist);
|
|
93
|
+
}
|
|
94
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
95
|
+
validateBetweenNode(node, whitelist);
|
|
96
|
+
}
|
|
97
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
98
|
+
validateNullCheckNode(node, whitelist);
|
|
99
|
+
}
|
|
24
100
|
}
|
|
25
101
|
/**
|
|
26
102
|
* Validate a comparison node
|
|
@@ -39,10 +115,41 @@ function validateComparisonNode(node, whitelist) {
|
|
|
39
115
|
}
|
|
40
116
|
}
|
|
41
117
|
// Validate operator-value combination
|
|
42
|
-
if (node.op === 'in' && !Array.isArray(node.value)) {
|
|
43
|
-
throw new errors_1.ValidationError(`Operator '
|
|
118
|
+
if ((node.op === 'in' || node.op === 'notIn') && !Array.isArray(node.value)) {
|
|
119
|
+
throw new errors_1.ValidationError(`Operator '${node.op}' requires an array value, got ${typeof node.value}`, node.field, node.op);
|
|
44
120
|
}
|
|
45
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Validate a NOT node
|
|
124
|
+
*/
|
|
125
|
+
function validateNotNode(node, whitelist) {
|
|
126
|
+
validateNode(node.operand, whitelist);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Validate a BETWEEN node
|
|
130
|
+
*/
|
|
131
|
+
function validateBetweenNode(node, whitelist) {
|
|
132
|
+
// Validate field
|
|
133
|
+
if (whitelist.allowedFields && whitelist.allowedFields.length > 0) {
|
|
134
|
+
if (!whitelist.allowedFields.includes(node.field)) {
|
|
135
|
+
throw new errors_1.ValidationError(`Field '${node.field}' is not allowed. Allowed fields: ${whitelist.allowedFields.join(', ')}`, node.field);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Validate operator (between is always allowed if fields are allowed)
|
|
139
|
+
// No operator validation needed for between
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validate a NULL_CHECK node
|
|
143
|
+
*/
|
|
144
|
+
function validateNullCheckNode(node, whitelist) {
|
|
145
|
+
// Validate field
|
|
146
|
+
if (whitelist.allowedFields && whitelist.allowedFields.length > 0) {
|
|
147
|
+
if (!whitelist.allowedFields.includes(node.field)) {
|
|
148
|
+
throw new errors_1.ValidationError(`Field '${node.field}' is not allowed. Allowed fields: ${whitelist.allowedFields.join(', ')}`, node.field);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// No operator validation needed for null checks
|
|
152
|
+
}
|
|
46
153
|
/**
|
|
47
154
|
* Validate a logical node
|
|
48
155
|
*/
|
|
@@ -70,6 +177,15 @@ function extractFieldsRecursive(node, fields) {
|
|
|
70
177
|
extractFieldsRecursive(node.left, fields);
|
|
71
178
|
extractFieldsRecursive(node.right, fields);
|
|
72
179
|
}
|
|
180
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
181
|
+
extractFieldsRecursive(node.operand, fields);
|
|
182
|
+
}
|
|
183
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
184
|
+
fields.push(node.field);
|
|
185
|
+
}
|
|
186
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
187
|
+
fields.push(node.field);
|
|
188
|
+
}
|
|
73
189
|
}
|
|
74
190
|
/**
|
|
75
191
|
* Extract all operators used in an AST
|
|
@@ -90,5 +206,97 @@ function extractOperatorsRecursive(node, operators) {
|
|
|
90
206
|
extractOperatorsRecursive(node.left, operators);
|
|
91
207
|
extractOperatorsRecursive(node.right, operators);
|
|
92
208
|
}
|
|
209
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
210
|
+
extractOperatorsRecursive(node.operand, operators);
|
|
211
|
+
}
|
|
212
|
+
// BetweenNode and NullCheckNode don't have operators in the Operator type
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Compute depth and node count for a query AST
|
|
216
|
+
*/
|
|
217
|
+
function computeComplexity(node) {
|
|
218
|
+
if ((0, ast_1.isComparisonNode)(node) || (0, ast_1.isBetweenNode)(node) || (0, ast_1.isNullCheckNode)(node)) {
|
|
219
|
+
return { depth: 1, nodes: 1 };
|
|
220
|
+
}
|
|
221
|
+
if ((0, ast_1.isLogicalNode)(node)) {
|
|
222
|
+
const left = computeComplexity(node.left);
|
|
223
|
+
const right = computeComplexity(node.right);
|
|
224
|
+
return {
|
|
225
|
+
depth: 1 + Math.max(left.depth, right.depth),
|
|
226
|
+
nodes: 1 + left.nodes + right.nodes,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if ((0, ast_1.isNotNode)(node)) {
|
|
230
|
+
const operand = computeComplexity(node.operand);
|
|
231
|
+
return {
|
|
232
|
+
depth: 1 + operand.depth,
|
|
233
|
+
nodes: 1 + operand.nodes,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
// Fallback (should not happen with current QastNode types)
|
|
237
|
+
return { depth: 1, nodes: 1 };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Sanitize field name to prevent injection attacks
|
|
241
|
+
*/
|
|
242
|
+
function sanitizeFieldName(field) {
|
|
243
|
+
// Remove any characters that aren't alphanumeric, underscore, or dot (for nested fields)
|
|
244
|
+
return field.replace(/[^a-zA-Z0-9_.]/g, '');
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Estimate query cost for rate limiting and resource management
|
|
248
|
+
*/
|
|
249
|
+
function estimateQueryCost(ast) {
|
|
250
|
+
const stats = computeComplexity(ast);
|
|
251
|
+
const fields = extractFields(ast);
|
|
252
|
+
const operators = extractOperators(ast);
|
|
253
|
+
// Simple cost estimation: depth * nodes + field diversity penalty
|
|
254
|
+
const estimatedComplexity = stats.depth * stats.nodes + fields.length * 2;
|
|
255
|
+
return {
|
|
256
|
+
estimatedComplexity,
|
|
257
|
+
depth: stats.depth,
|
|
258
|
+
nodeCount: stats.nodes,
|
|
259
|
+
fieldCount: fields.length,
|
|
260
|
+
operatorCount: operators.length,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Rate limiting helper - simple in-memory rate limiter
|
|
265
|
+
*/
|
|
266
|
+
class RateLimiter {
|
|
267
|
+
constructor(maxRequests = 100, windowMs = 60000) {
|
|
268
|
+
this.requests = new Map();
|
|
269
|
+
this.windowMs = windowMs;
|
|
270
|
+
this.maxRequests = maxRequests;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if request is allowed
|
|
274
|
+
*/
|
|
275
|
+
isAllowed(identifier) {
|
|
276
|
+
const now = Date.now();
|
|
277
|
+
const userRequests = this.requests.get(identifier) || [];
|
|
278
|
+
// Remove old requests outside the window
|
|
279
|
+
const recentRequests = userRequests.filter(timestamp => now - timestamp < this.windowMs);
|
|
280
|
+
if (recentRequests.length >= this.maxRequests) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
// Add current request
|
|
284
|
+
recentRequests.push(now);
|
|
285
|
+
this.requests.set(identifier, recentRequests);
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Reset rate limiter for an identifier
|
|
290
|
+
*/
|
|
291
|
+
reset(identifier) {
|
|
292
|
+
this.requests.delete(identifier);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Clear all rate limit data
|
|
296
|
+
*/
|
|
297
|
+
clear() {
|
|
298
|
+
this.requests.clear();
|
|
299
|
+
}
|
|
93
300
|
}
|
|
301
|
+
exports.RateLimiter = RateLimiter;
|
|
94
302
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/parser/validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/parser/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/types/ast.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Supported comparison operators
|
|
3
3
|
*/
|
|
4
|
-
export type Operator = 'eq' | 'ne' | 'gt' | 'lt' | 'gte' | 'lte' | 'in' | 'contains' | 'startsWith' | 'endsWith';
|
|
4
|
+
export type Operator = 'eq' | 'ne' | 'gt' | 'lt' | 'gte' | 'lte' | 'in' | 'notIn' | 'contains' | 'startsWith' | 'endsWith' | 'like' | 'regex' | 'matches';
|
|
5
5
|
/**
|
|
6
6
|
* Supported value types in comparisons
|
|
7
7
|
*/
|
|
@@ -10,6 +10,10 @@ export type QastValue = string | number | boolean | null | string[] | number[];
|
|
|
10
10
|
* Logical operator type
|
|
11
11
|
*/
|
|
12
12
|
export type LogicalOperator = 'AND' | 'OR';
|
|
13
|
+
/**
|
|
14
|
+
* Sort direction
|
|
15
|
+
*/
|
|
16
|
+
export type SortDirection = 'asc' | 'desc';
|
|
13
17
|
/**
|
|
14
18
|
* Comparison node representing a field comparison operation
|
|
15
19
|
*/
|
|
@@ -28,9 +32,49 @@ export interface LogicalNode {
|
|
|
28
32
|
right: QastNode;
|
|
29
33
|
}
|
|
30
34
|
/**
|
|
31
|
-
*
|
|
35
|
+
* NOT node representing a logical NOT operation
|
|
36
|
+
*/
|
|
37
|
+
export interface NotNode {
|
|
38
|
+
type: 'NOT';
|
|
39
|
+
operand: QastNode;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Between node representing a range comparison
|
|
43
|
+
*/
|
|
44
|
+
export interface BetweenNode {
|
|
45
|
+
type: 'BETWEEN';
|
|
46
|
+
field: string;
|
|
47
|
+
min: number | string;
|
|
48
|
+
max: number | string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Null check node representing isNull or isNotNull operations
|
|
52
|
+
*/
|
|
53
|
+
export interface NullCheckNode {
|
|
54
|
+
type: 'NULL_CHECK';
|
|
55
|
+
field: string;
|
|
56
|
+
isNull: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Order by specification
|
|
60
|
+
*/
|
|
61
|
+
export interface OrderByClause {
|
|
62
|
+
field: string;
|
|
63
|
+
direction: SortDirection;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Root AST node type - can be a comparison, logical operation, NOT, BETWEEN, or NULL_CHECK
|
|
67
|
+
*/
|
|
68
|
+
export type QastNode = LogicalNode | ComparisonNode | NotNode | BetweenNode | NullCheckNode;
|
|
69
|
+
/**
|
|
70
|
+
* Complete query AST with filter, sorting, and pagination
|
|
32
71
|
*/
|
|
33
|
-
export
|
|
72
|
+
export interface QueryAST {
|
|
73
|
+
filter: QastNode;
|
|
74
|
+
orderBy?: OrderByClause[];
|
|
75
|
+
limit?: number;
|
|
76
|
+
offset?: number;
|
|
77
|
+
}
|
|
34
78
|
/**
|
|
35
79
|
* Type guard to check if a node is a ComparisonNode
|
|
36
80
|
*/
|
|
@@ -39,6 +83,18 @@ export declare function isComparisonNode(node: QastNode): node is ComparisonNode
|
|
|
39
83
|
* Type guard to check if a node is a LogicalNode
|
|
40
84
|
*/
|
|
41
85
|
export declare function isLogicalNode(node: QastNode): node is LogicalNode;
|
|
86
|
+
/**
|
|
87
|
+
* Type guard to check if a node is a NotNode
|
|
88
|
+
*/
|
|
89
|
+
export declare function isNotNode(node: QastNode): node is NotNode;
|
|
90
|
+
/**
|
|
91
|
+
* Type guard to check if a node is a BetweenNode
|
|
92
|
+
*/
|
|
93
|
+
export declare function isBetweenNode(node: QastNode): node is BetweenNode;
|
|
94
|
+
/**
|
|
95
|
+
* Type guard to check if a node is a NullCheckNode
|
|
96
|
+
*/
|
|
97
|
+
export declare function isNullCheckNode(node: QastNode): node is NullCheckNode;
|
|
42
98
|
/**
|
|
43
99
|
* Options for parsing queries
|
|
44
100
|
*/
|
|
@@ -55,6 +111,28 @@ export interface ParseOptions {
|
|
|
55
111
|
* Whether to validate the query against whitelists after parsing
|
|
56
112
|
*/
|
|
57
113
|
validate?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Maximum allowed depth of the AST (to limit nested logical expressions)
|
|
116
|
+
* e.g. a simple comparison has depth 1, `(a and b) or c` has depth 2.
|
|
117
|
+
*/
|
|
118
|
+
maxDepth?: number;
|
|
119
|
+
/**
|
|
120
|
+
* Maximum allowed number of nodes in the AST (to limit overall complexity)
|
|
121
|
+
* Each comparison or logical node counts as 1.
|
|
122
|
+
*/
|
|
123
|
+
maxNodes?: number;
|
|
124
|
+
/**
|
|
125
|
+
* Maximum allowed length of the raw query string (checked before parsing)
|
|
126
|
+
*/
|
|
127
|
+
maxQueryLength?: number;
|
|
128
|
+
/**
|
|
129
|
+
* Maximum allowed length of array values (for 'in' operator)
|
|
130
|
+
*/
|
|
131
|
+
maxArrayLength?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Maximum allowed length of string values
|
|
134
|
+
*/
|
|
135
|
+
maxStringLength?: number;
|
|
58
136
|
}
|
|
59
137
|
/**
|
|
60
138
|
* Options for query validation
|
|
@@ -69,4 +147,25 @@ export interface WhitelistOptions {
|
|
|
69
147
|
*/
|
|
70
148
|
allowedOperators?: Operator[];
|
|
71
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Options for query complexity validation
|
|
152
|
+
*/
|
|
153
|
+
export interface ComplexityOptions {
|
|
154
|
+
/**
|
|
155
|
+
* Maximum allowed depth of the AST.
|
|
156
|
+
*/
|
|
157
|
+
maxDepth?: number;
|
|
158
|
+
/**
|
|
159
|
+
* Maximum allowed number of nodes in the AST.
|
|
160
|
+
*/
|
|
161
|
+
maxNodes?: number;
|
|
162
|
+
/**
|
|
163
|
+
* Maximum allowed length of array values (for 'in' operator).
|
|
164
|
+
*/
|
|
165
|
+
maxArrayLength?: number;
|
|
166
|
+
/**
|
|
167
|
+
* Maximum allowed length of string values.
|
|
168
|
+
*/
|
|
169
|
+
maxStringLength?: number;
|
|
170
|
+
}
|
|
72
171
|
//# sourceMappingURL=ast.d.ts.map
|