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