qast 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +260 -5
  2. package/README.zh-CN.md +520 -0
  3. package/dist/adapters/drizzle.d.ts +66 -0
  4. package/dist/adapters/drizzle.d.ts.map +1 -0
  5. package/dist/adapters/drizzle.js +222 -0
  6. package/dist/adapters/drizzle.js.map +1 -0
  7. package/dist/adapters/knex.d.ts +22 -0
  8. package/dist/adapters/knex.d.ts.map +1 -0
  9. package/dist/adapters/knex.js +158 -0
  10. package/dist/adapters/knex.js.map +1 -0
  11. package/dist/adapters/mongoose.d.ts +15 -0
  12. package/dist/adapters/mongoose.d.ts.map +1 -0
  13. package/dist/adapters/mongoose.js +152 -0
  14. package/dist/adapters/mongoose.js.map +1 -0
  15. package/dist/adapters/prisma.d.ts +5 -2
  16. package/dist/adapters/prisma.d.ts.map +1 -1
  17. package/dist/adapters/prisma.js +103 -4
  18. package/dist/adapters/prisma.js.map +1 -1
  19. package/dist/adapters/sequelize.d.ts +26 -8
  20. package/dist/adapters/sequelize.d.ts.map +1 -1
  21. package/dist/adapters/sequelize.js +168 -7
  22. package/dist/adapters/sequelize.js.map +1 -1
  23. package/dist/adapters/typeorm.d.ts +32 -2
  24. package/dist/adapters/typeorm.d.ts.map +1 -1
  25. package/dist/adapters/typeorm.js +169 -3
  26. package/dist/adapters/typeorm.js.map +1 -1
  27. package/dist/builder/query-builder.d.ts +139 -0
  28. package/dist/builder/query-builder.d.ts.map +1 -0
  29. package/dist/builder/query-builder.js +320 -0
  30. package/dist/builder/query-builder.js.map +1 -0
  31. package/dist/errors.d.ts +18 -3
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +127 -9
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +83 -8
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +108 -8
  38. package/dist/index.js.map +1 -1
  39. package/dist/integrations/express.d.ts +14 -0
  40. package/dist/integrations/express.d.ts.map +1 -0
  41. package/dist/integrations/express.js +33 -0
  42. package/dist/integrations/express.js.map +1 -0
  43. package/dist/integrations/fastify.d.ts +17 -0
  44. package/dist/integrations/fastify.d.ts.map +1 -0
  45. package/dist/integrations/fastify.js +35 -0
  46. package/dist/integrations/fastify.js.map +1 -0
  47. package/dist/integrations/hono.d.ts +14 -0
  48. package/dist/integrations/hono.d.ts.map +1 -0
  49. package/dist/integrations/hono.js +30 -0
  50. package/dist/integrations/hono.js.map +1 -0
  51. package/dist/integrations/nestjs.d.ts +23 -0
  52. package/dist/integrations/nestjs.d.ts.map +1 -0
  53. package/dist/integrations/nestjs.js +137 -0
  54. package/dist/integrations/nestjs.js.map +1 -0
  55. package/dist/parser/parser.d.ts +15 -7
  56. package/dist/parser/parser.d.ts.map +1 -1
  57. package/dist/parser/parser.js +117 -15
  58. package/dist/parser/parser.js.map +1 -1
  59. package/dist/parser/tokenizer.d.ts +11 -1
  60. package/dist/parser/tokenizer.d.ts.map +1 -1
  61. package/dist/parser/tokenizer.js +67 -10
  62. package/dist/parser/tokenizer.js.map +1 -1
  63. package/dist/parser/validator.d.ts +39 -0
  64. package/dist/parser/validator.d.ts.map +1 -1
  65. package/dist/parser/validator.js +144 -3
  66. package/dist/parser/validator.js.map +1 -1
  67. package/dist/types/ast.d.ts +59 -3
  68. package/dist/types/ast.d.ts.map +1 -1
  69. package/dist/types/ast.js +21 -0
  70. package/dist/types/ast.js.map +1 -1
  71. package/dist/utils/ast-utils.d.ts +43 -0
  72. package/dist/utils/ast-utils.d.ts.map +1 -0
  73. package/dist/utils/ast-utils.js +205 -0
  74. package/dist/utils/ast-utils.js.map +1 -0
  75. package/dist/utils/cache.d.ts +47 -0
  76. package/dist/utils/cache.d.ts.map +1 -0
  77. package/dist/utils/cache.js +132 -0
  78. package/dist/utils/cache.js.map +1 -0
  79. package/dist/utils/serializer.d.ts +6 -0
  80. package/dist/utils/serializer.d.ts.map +1 -0
  81. package/dist/utils/serializer.js +140 -0
  82. package/dist/utils/serializer.js.map +1 -0
  83. package/package.json +29 -5
@@ -0,0 +1 @@
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;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
- super(`${message} at position ${position}`);
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 start = Math.max(0, this.position - 10);
30
- const end = Math.min(this.query.length, this.position + 10);
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
- return `${before}[ERROR]${after}`;
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
- super(message);
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
- super(message);
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
@@ -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
@@ -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 { QastNode, ComparisonNode, LogicalNode, LogicalOperator, Operator, QastValue, ParseOptions, WhitelistOptions, ComplexityOptions, isComparisonNode, isLogicalNode, } from './types/ast';
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
- import { ParseOptions, QastNode } from './types/ast';
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
- * Parse a query string into an AST
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 parseQuery(query: string, options?: ParseOptions): QastNode;
117
+ export declare function parseQueryFull<T extends FieldSchema = FieldSchema>(query: string, options?: TypedParseOptions<T>): QueryAST;
43
118
  //# 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
@@ -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 validator_2 = require("./parser/validator");
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 ast = (0, parser_2.parseQueryString)(query);
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, validator_2.validateQuery)(ast, whitelist);
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, validator_2.validateQueryComplexity)(ast, {
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 ast;
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;;;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
@@ -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