qast 1.2.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +775 -520
  3. package/README.zh-CN.md +520 -0
  4. package/dist/adapters/drizzle.d.ts +66 -0
  5. package/dist/adapters/drizzle.d.ts.map +1 -0
  6. package/dist/adapters/drizzle.js +222 -0
  7. package/dist/adapters/drizzle.js.map +1 -0
  8. package/dist/adapters/knex.d.ts +22 -0
  9. package/dist/adapters/knex.d.ts.map +1 -0
  10. package/dist/adapters/knex.js +158 -0
  11. package/dist/adapters/knex.js.map +1 -0
  12. package/dist/adapters/mongoose.d.ts +15 -0
  13. package/dist/adapters/mongoose.d.ts.map +1 -0
  14. package/dist/adapters/mongoose.js +153 -0
  15. package/dist/adapters/mongoose.js.map +1 -0
  16. package/dist/adapters/prisma.d.ts +5 -2
  17. package/dist/adapters/prisma.d.ts.map +1 -1
  18. package/dist/adapters/prisma.js +102 -4
  19. package/dist/adapters/prisma.js.map +1 -1
  20. package/dist/adapters/sequelize.d.ts +26 -8
  21. package/dist/adapters/sequelize.d.ts.map +1 -1
  22. package/dist/adapters/sequelize.js +168 -7
  23. package/dist/adapters/sequelize.js.map +1 -1
  24. package/dist/adapters/typeorm.d.ts +32 -2
  25. package/dist/adapters/typeorm.d.ts.map +1 -1
  26. package/dist/adapters/typeorm.js +169 -3
  27. package/dist/adapters/typeorm.js.map +1 -1
  28. package/dist/builder/query-builder.d.ts +139 -0
  29. package/dist/builder/query-builder.d.ts.map +1 -0
  30. package/dist/builder/query-builder.js +320 -0
  31. package/dist/builder/query-builder.js.map +1 -0
  32. package/dist/errors.d.ts +18 -3
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +130 -10
  35. package/dist/errors.js.map +1 -1
  36. package/dist/index.d.ts +77 -11
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +124 -16
  39. package/dist/index.js.map +1 -1
  40. package/dist/integrations/express.d.ts +14 -0
  41. package/dist/integrations/express.d.ts.map +1 -0
  42. package/dist/integrations/express.js +33 -0
  43. package/dist/integrations/express.js.map +1 -0
  44. package/dist/integrations/fastify.d.ts +17 -0
  45. package/dist/integrations/fastify.d.ts.map +1 -0
  46. package/dist/integrations/fastify.js +35 -0
  47. package/dist/integrations/fastify.js.map +1 -0
  48. package/dist/integrations/hono.d.ts +14 -0
  49. package/dist/integrations/hono.d.ts.map +1 -0
  50. package/dist/integrations/hono.js +30 -0
  51. package/dist/integrations/hono.js.map +1 -0
  52. package/dist/integrations/nestjs.d.ts +23 -0
  53. package/dist/integrations/nestjs.d.ts.map +1 -0
  54. package/dist/integrations/nestjs.js +137 -0
  55. package/dist/integrations/nestjs.js.map +1 -0
  56. package/dist/parser/parser.d.ts +15 -7
  57. package/dist/parser/parser.d.ts.map +1 -1
  58. package/dist/parser/parser.js +117 -15
  59. package/dist/parser/parser.js.map +1 -1
  60. package/dist/parser/tokenizer.d.ts +11 -1
  61. package/dist/parser/tokenizer.d.ts.map +1 -1
  62. package/dist/parser/tokenizer.js +67 -10
  63. package/dist/parser/tokenizer.js.map +1 -1
  64. package/dist/parser/validator.d.ts +39 -0
  65. package/dist/parser/validator.d.ts.map +1 -1
  66. package/dist/parser/validator.js +144 -3
  67. package/dist/parser/validator.js.map +1 -1
  68. package/dist/types/ast.d.ts +59 -3
  69. package/dist/types/ast.d.ts.map +1 -1
  70. package/dist/types/ast.js +21 -0
  71. package/dist/types/ast.js.map +1 -1
  72. package/dist/utils/ast-utils.d.ts +43 -0
  73. package/dist/utils/ast-utils.d.ts.map +1 -0
  74. package/dist/utils/ast-utils.js +205 -0
  75. package/dist/utils/ast-utils.js.map +1 -0
  76. package/dist/utils/cache.d.ts +47 -0
  77. package/dist/utils/cache.d.ts.map +1 -0
  78. package/dist/utils/cache.js +132 -0
  79. package/dist/utils/cache.js.map +1 -0
  80. package/dist/utils/serializer.d.ts +6 -0
  81. package/dist/utils/serializer.d.ts.map +1 -0
  82. package/dist/utils/serializer.js +140 -0
  83. package/dist/utils/serializer.js.map +1 -0
  84. package/package.json +124 -84
@@ -0,0 +1 @@
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
- constructor(message: string, position: number, query: string);
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
- constructor(message: string, position?: number, query?: string);
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
- constructor(message: string, field?: string, operator?: string);
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
@@ -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;gBAElB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAO5D;;OAEG;IACH,UAAU,IAAI,MAAM;CAOrB;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAM/D;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;CAM/D"}
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(this, this.constructor);
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
- super(`${message} at position ${position}`);
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 start = Math.max(0, this.position - 10);
30
- const end = Math.min(this.query.length, this.position + 10);
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
- return `${before}[ERROR]${after}`;
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
- super(message);
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
- super(message);
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
@@ -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;IAI9C,YAAY,OAAe,EAAE,QAAgB,EAAE,KAAa;QAC1D,KAAK,CAAC,GAAG,OAAO,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO,GAAG,MAAM,UAAU,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AArBD,8CAqBC;AAED;;GAEG;AACH,MAAa,UAAW,SAAQ,SAAS;IAIvC,YAAY,OAAe,EAAE,QAAiB,EAAE,KAAc;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAVD,gCAUC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,SAAS;IAI5C,YAAY,OAAe,EAAE,KAAc,EAAE,QAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAVD,0CAUC"}
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
- * QAST - Query to AST to ORM
2
+ * @packageDocumentation
3
3
  *
4
- * A library that parses human-readable query strings into ASTs
5
- * and transforms them into ORM-compatible filter objects.
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 { QastNode, ComparisonNode, LogicalNode, LogicalOperator, Operator, QastValue, ParseOptions, WhitelistOptions, ComplexityOptions, isComparisonNode, isLogicalNode, } from './types/ast';
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
- import { ParseOptions, QastNode } from './types/ast';
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
- * Parse a query string into an AST
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 parseQuery(query: string, options?: ParseOptions): QastNode;
108
+ export declare function parseQueryFull<T extends FieldSchema = FieldSchema>(query: string, options?: TypedParseOptions<T>): QueryAST;
43
109
  //# sourceMappingURL=index.d.ts.map
@@ -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;AACnD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG1E,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,eAAe,EACf,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,SAAS,EACT,UAAU,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAoB,MAAM,aAAa,CAAC;AAGvE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CA0C1E"}
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
- * QAST - Query to AST to ORM
3
+ * @packageDocumentation
4
4
  *
5
- * A library that parses human-readable query strings into ASTs
6
- * and transforms them into ORM-compatible filter objects.
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
- // Export parser
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
- // Export validators
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
- // Export adapters
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
- // Export types
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
- // Export errors
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 validator_2 = require("./parser/validator");
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 ast = (0, parser_2.parseQueryString)(query);
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, validator_2.validateQuery)(ast, whitelist);
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, validator_2.validateQueryComplexity)(ast, {
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 ast;
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;;;;;GAKG;;;AA0EH,gCA0CC;AAlHD,gBAAgB;AAChB,0CAAmD;AAA1C,0GAAA,gBAAgB,OAAA;AACzB,gDAAiE;AAAxD,sGAAA,SAAS,OAAA;AAAS,sGAAA,SAAS,OAAA;AAEpC,oBAAoB;AACpB,gDAK4B;AAJ1B,0GAAA,aAAa,OAAA;AACb,oHAAA,uBAAuB,OAAA;AACvB,0GAAA,aAAa,OAAA;AACb,6GAAA,gBAAgB,OAAA;AAGlB,kBAAkB;AAClB,4CAAiE;AAAxD,wGAAA,cAAc,OAAA;AACvB,8CAAoE;AAA3D,0GAAA,eAAe,OAAA;AACxB,kDAA0E;AAAjE,8GAAA,iBAAiB,OAAA;AAE1B,eAAe;AACf,mCAYqB;AAFnB,uGAAA,gBAAgB,OAAA;AAChB,oGAAA,aAAa,OAAA;AAGf,gBAAgB;AAChB,mCAKkB;AAJhB,mGAAA,SAAS,OAAA;AACT,oGAAA,UAAU,OAAA;AACV,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AAGnB,mCAAmC;AACnC,4CAAmD;AACnD,kDAA4E;AAE5E,qCAA2C;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,UAAU,CAAC,KAAa,EAAE,OAAsB;IAC9D,6DAA6D;IAC7D,IAAI,OAAO,EAAE,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACnF,MAAM,IAAI,wBAAe,CACvB,6BAA6B,KAAK,CAAC,MAAM,qCAAqC,OAAO,CAAC,cAAc,EAAE,CACvG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,yBAAgB,EAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,OAAO,EAAE,CAAC;QACZ,yCAAyC;QACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAqB;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAC;YAEF,2CAA2C;YAC3C,IAAI,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAC1D,IAAA,yBAAa,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,mBAAmB,GACvB,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC9B,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC9B,OAAO,CAAC,cAAc,KAAK,SAAS;YACpC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC;QAExC,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAA,mCAAuB,EAAC,GAAG,EAAE;gBAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
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