@allurereport/aql 3.1.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 +482 -0
- package/dist/errors/index.d.ts +105 -0
- package/dist/errors/index.js +165 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/filter/index.d.ts +43 -0
- package/dist/filter/index.js +335 -0
- package/dist/filter/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +192 -0
- package/dist/model.js +45 -0
- package/dist/model.js.map +1 -0
- package/dist/parser/index.d.ts +120 -0
- package/dist/parser/index.js +497 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/tokenizer/index.d.ts +89 -0
- package/dist/tokenizer/index.js +416 -0
- package/dist/tokenizer/index.js.map +1 -0
- package/dist/utils/index.d.ts +56 -0
- package/dist/utils/index.js +139 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenizer for AQL
|
|
3
|
+
*/
|
|
4
|
+
import { AqlErrors } from "../errors/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Tokenizer for AQL (Allure Query Language).
|
|
7
|
+
* Converts AQL strings into tokens for parsing.
|
|
8
|
+
*/
|
|
9
|
+
export class AqlTokenizer {
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new AQL tokenizer instance.
|
|
12
|
+
*
|
|
13
|
+
* @param input - The AQL string to tokenize
|
|
14
|
+
*/
|
|
15
|
+
constructor(input) {
|
|
16
|
+
this.position = 0;
|
|
17
|
+
this.tokens = [];
|
|
18
|
+
this.input = input;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tokenizes the input string into an array of tokens.
|
|
22
|
+
*
|
|
23
|
+
* @returns Array of tokens representing the AQL string
|
|
24
|
+
* @throws {AqlTokenizerError} If the input contains invalid characters or unterminated strings
|
|
25
|
+
*/
|
|
26
|
+
tokenize() {
|
|
27
|
+
this.position = 0;
|
|
28
|
+
this.tokens = [];
|
|
29
|
+
while (this.position < this.input.length) {
|
|
30
|
+
const token = this.nextToken();
|
|
31
|
+
if (token.type !== "WS") {
|
|
32
|
+
this.tokens.push(token);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
this.tokens.push({ type: "EOL", position: this.position });
|
|
36
|
+
return this.tokens;
|
|
37
|
+
}
|
|
38
|
+
nextToken() {
|
|
39
|
+
const startPos = this.position;
|
|
40
|
+
if (this.position >= this.input.length) {
|
|
41
|
+
return { type: "EOL", position: startPos };
|
|
42
|
+
}
|
|
43
|
+
// Skip whitespace
|
|
44
|
+
if (this.isWhitespace(this.currentChar())) {
|
|
45
|
+
return this.readWhitespace();
|
|
46
|
+
}
|
|
47
|
+
// Operators (multi-character first)
|
|
48
|
+
if (this.match(">=")) {
|
|
49
|
+
return { type: "GE", position: startPos };
|
|
50
|
+
}
|
|
51
|
+
if (this.match("<=")) {
|
|
52
|
+
return { type: "LE", position: startPos };
|
|
53
|
+
}
|
|
54
|
+
if (this.match("!=")) {
|
|
55
|
+
return { type: "NEQ", position: startPos };
|
|
56
|
+
}
|
|
57
|
+
if (this.match("~=")) {
|
|
58
|
+
return { type: "CONTAINS", position: startPos };
|
|
59
|
+
}
|
|
60
|
+
// Single character operators
|
|
61
|
+
if (this.currentChar() === ">") {
|
|
62
|
+
this.advance();
|
|
63
|
+
return { type: "GT", position: startPos };
|
|
64
|
+
}
|
|
65
|
+
if (this.currentChar() === "<") {
|
|
66
|
+
this.advance();
|
|
67
|
+
return { type: "LT", position: startPos };
|
|
68
|
+
}
|
|
69
|
+
if (this.currentChar() === "=") {
|
|
70
|
+
this.advance();
|
|
71
|
+
return { type: "EQ", position: startPos };
|
|
72
|
+
}
|
|
73
|
+
// Brackets
|
|
74
|
+
if (this.currentChar() === "(") {
|
|
75
|
+
this.advance();
|
|
76
|
+
return { type: "LPAREN", position: startPos };
|
|
77
|
+
}
|
|
78
|
+
if (this.currentChar() === ")") {
|
|
79
|
+
this.advance();
|
|
80
|
+
return { type: "RPAREN", position: startPos };
|
|
81
|
+
}
|
|
82
|
+
if (this.currentChar() === "[") {
|
|
83
|
+
this.advance();
|
|
84
|
+
return { type: "LBRACKET", position: startPos };
|
|
85
|
+
}
|
|
86
|
+
if (this.currentChar() === "]") {
|
|
87
|
+
this.advance();
|
|
88
|
+
return { type: "RBRACKET", position: startPos };
|
|
89
|
+
}
|
|
90
|
+
if (this.currentChar() === ",") {
|
|
91
|
+
this.advance();
|
|
92
|
+
return { type: "COMMA", position: startPos };
|
|
93
|
+
}
|
|
94
|
+
// Strings
|
|
95
|
+
if (this.currentChar() === '"') {
|
|
96
|
+
return this.readString();
|
|
97
|
+
}
|
|
98
|
+
// Numbers
|
|
99
|
+
if (this.isDigit(this.currentChar()) || (this.currentChar() === "-" && this.isDigit(this.peek()))) {
|
|
100
|
+
return this.readNumber();
|
|
101
|
+
}
|
|
102
|
+
// Identifiers and keywords
|
|
103
|
+
if (this.isIdentifierStart(this.currentChar())) {
|
|
104
|
+
return this.readIdentifier();
|
|
105
|
+
}
|
|
106
|
+
// Unknown character
|
|
107
|
+
const char = this.currentChar();
|
|
108
|
+
this.advance();
|
|
109
|
+
throw AqlErrors.unexpectedCharacter(char, startPos);
|
|
110
|
+
}
|
|
111
|
+
readWhitespace() {
|
|
112
|
+
const startPos = this.position;
|
|
113
|
+
while (this.position < this.input.length && this.isWhitespace(this.currentChar())) {
|
|
114
|
+
this.advance();
|
|
115
|
+
}
|
|
116
|
+
return { type: "WS", position: startPos };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Reads a string token.
|
|
120
|
+
* Supports all Unicode characters including Chinese, Japanese, Korean, etc.
|
|
121
|
+
* String values can contain any Unicode characters, not just identifiers.
|
|
122
|
+
* Correctly handles brackets (), [], operators (>=, <=, etc.), and other special
|
|
123
|
+
* characters inside strings - they are treated as regular characters, not as tokens.
|
|
124
|
+
* Only the closing quote (") terminates the string.
|
|
125
|
+
*/
|
|
126
|
+
readString() {
|
|
127
|
+
const startPos = this.position;
|
|
128
|
+
this.advance(); // Skip opening quote
|
|
129
|
+
const chars = [];
|
|
130
|
+
while (this.position < this.input.length) {
|
|
131
|
+
if (this.currentChar() === "\\") {
|
|
132
|
+
this.advance();
|
|
133
|
+
if (this.position < this.input.length) {
|
|
134
|
+
const escaped = this.currentChar();
|
|
135
|
+
switch (escaped) {
|
|
136
|
+
case "n":
|
|
137
|
+
chars.push("\n");
|
|
138
|
+
break;
|
|
139
|
+
case "t":
|
|
140
|
+
chars.push("\t");
|
|
141
|
+
break;
|
|
142
|
+
case "r":
|
|
143
|
+
chars.push("\r");
|
|
144
|
+
break;
|
|
145
|
+
case "\\":
|
|
146
|
+
chars.push("\\");
|
|
147
|
+
break;
|
|
148
|
+
case '"':
|
|
149
|
+
chars.push('"');
|
|
150
|
+
break;
|
|
151
|
+
case "u": {
|
|
152
|
+
// Unicode escape sequence \uXXXX
|
|
153
|
+
this.advance();
|
|
154
|
+
if (this.position + 4 > this.input.length) {
|
|
155
|
+
throw AqlErrors.invalidUnicodeEscape(this.position);
|
|
156
|
+
}
|
|
157
|
+
let hexValue = 0;
|
|
158
|
+
for (let i = 0; i < 4; i++) {
|
|
159
|
+
const char = this.input[this.position + i];
|
|
160
|
+
const code = char?.charCodeAt(0) ?? 0;
|
|
161
|
+
let digit;
|
|
162
|
+
if (code >= 48 && code <= 57) {
|
|
163
|
+
// '0'-'9'
|
|
164
|
+
digit = code - 48;
|
|
165
|
+
}
|
|
166
|
+
else if (code >= 65 && code <= 70) {
|
|
167
|
+
// 'A'-'F'
|
|
168
|
+
digit = code - 55;
|
|
169
|
+
}
|
|
170
|
+
else if (code >= 97 && code <= 102) {
|
|
171
|
+
// 'a'-'f'
|
|
172
|
+
digit = code - 87;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
throw AqlErrors.invalidUnicodeEscape(this.position);
|
|
176
|
+
}
|
|
177
|
+
hexValue = hexValue * 16 + digit;
|
|
178
|
+
}
|
|
179
|
+
chars.push(String.fromCharCode(hexValue));
|
|
180
|
+
this.position += 4;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
default:
|
|
184
|
+
chars.push(escaped);
|
|
185
|
+
}
|
|
186
|
+
this.advance();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (this.currentChar() === '"') {
|
|
190
|
+
this.advance(); // Skip closing quote
|
|
191
|
+
const value = chars.join("");
|
|
192
|
+
return { type: "STRING", value: `"${value}"`, position: startPos };
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
/**
|
|
196
|
+
* Accept any Unicode character in string values.
|
|
197
|
+
* This includes Chinese, Japanese, Korean, Arabic, and all other Unicode characters.
|
|
198
|
+
*/
|
|
199
|
+
chars.push(this.currentChar());
|
|
200
|
+
this.advance();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
throw AqlErrors.unterminatedString(startPos);
|
|
204
|
+
}
|
|
205
|
+
readNumber() {
|
|
206
|
+
const startPos = this.position;
|
|
207
|
+
const chars = [];
|
|
208
|
+
// Minus sign
|
|
209
|
+
if (this.currentChar() === "-") {
|
|
210
|
+
chars.push(this.currentChar());
|
|
211
|
+
this.advance();
|
|
212
|
+
}
|
|
213
|
+
// Integer part
|
|
214
|
+
while (this.position < this.input.length && this.isDigit(this.currentChar())) {
|
|
215
|
+
chars.push(this.currentChar());
|
|
216
|
+
this.advance();
|
|
217
|
+
}
|
|
218
|
+
// Fractional part
|
|
219
|
+
if (this.currentChar() === ".") {
|
|
220
|
+
chars.push(this.currentChar());
|
|
221
|
+
this.advance();
|
|
222
|
+
while (this.position < this.input.length && this.isDigit(this.currentChar())) {
|
|
223
|
+
chars.push(this.currentChar());
|
|
224
|
+
this.advance();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const value = chars.join("");
|
|
228
|
+
return { type: "NUMBER", value, position: startPos };
|
|
229
|
+
}
|
|
230
|
+
readIdentifier() {
|
|
231
|
+
const startPos = this.position;
|
|
232
|
+
const chars = [];
|
|
233
|
+
while (this.position < this.input.length && this.isIdentifierChar(this.currentChar())) {
|
|
234
|
+
chars.push(this.currentChar());
|
|
235
|
+
this.advance();
|
|
236
|
+
}
|
|
237
|
+
const value = chars.join("");
|
|
238
|
+
const length = value.length;
|
|
239
|
+
// Check keywords using helper functions
|
|
240
|
+
if (this.isKeywordAnd(value, length)) {
|
|
241
|
+
return { type: "AND", position: startPos };
|
|
242
|
+
}
|
|
243
|
+
if (this.isKeywordOr(value, length)) {
|
|
244
|
+
return { type: "OR", position: startPos };
|
|
245
|
+
}
|
|
246
|
+
if (this.isKeywordNot(value, length)) {
|
|
247
|
+
return { type: "NOT", position: startPos };
|
|
248
|
+
}
|
|
249
|
+
if (this.isKeywordIn(value, length)) {
|
|
250
|
+
return { type: "IN", position: startPos };
|
|
251
|
+
}
|
|
252
|
+
if (this.isKeywordIs(value, length)) {
|
|
253
|
+
return { type: "EQ", position: startPos };
|
|
254
|
+
}
|
|
255
|
+
if (this.isKeywordBoolean(value)) {
|
|
256
|
+
return { type: "BOOLEAN", value, position: startPos };
|
|
257
|
+
}
|
|
258
|
+
if (this.isKeywordNull(value)) {
|
|
259
|
+
return { type: "NULL", position: startPos };
|
|
260
|
+
}
|
|
261
|
+
// Check function (identifier with "()")
|
|
262
|
+
if (this.currentChar() === "(" && this.peek() === ")") {
|
|
263
|
+
this.advance(); // (
|
|
264
|
+
this.advance(); // )
|
|
265
|
+
return { type: "FUNCTION", value: `${value}()`, position: startPos };
|
|
266
|
+
}
|
|
267
|
+
return { type: "IDENTIFIER", value, position: startPos };
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Case-insensitive comparison helper for short strings (optimized for keywords)
|
|
271
|
+
* Compares characters directly by their codes to avoid creating new strings
|
|
272
|
+
*/
|
|
273
|
+
equalsIgnoreCase(str, target) {
|
|
274
|
+
if (str.length !== target.length) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
for (let i = 0; i < str.length; i++) {
|
|
278
|
+
const strCode = str.charCodeAt(i);
|
|
279
|
+
const targetCode = target.charCodeAt(i);
|
|
280
|
+
// Convert both to lowercase by comparing codes directly
|
|
281
|
+
// 'A' (65) to 'Z' (90) -> 'a' (97) to 'z' (122)
|
|
282
|
+
// 'a' (97) to 'z' (122) stays the same
|
|
283
|
+
const strLower = strCode >= 65 && strCode <= 90 ? strCode + 32 : strCode;
|
|
284
|
+
const targetLower = targetCode >= 65 && targetCode <= 90 ? targetCode + 32 : targetCode;
|
|
285
|
+
if (strLower !== targetLower) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if first character matches (case-insensitive) without creating new string
|
|
293
|
+
*/
|
|
294
|
+
firstCharMatches(value, char) {
|
|
295
|
+
if (!value || value.length === 0) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
const valueCode = value.charCodeAt(0);
|
|
299
|
+
const charCode = char.charCodeAt(0);
|
|
300
|
+
// Convert both to lowercase for comparison
|
|
301
|
+
const valueLower = valueCode >= 65 && valueCode <= 90 ? valueCode + 32 : valueCode;
|
|
302
|
+
const charLower = charCode >= 65 && charCode <= 90 ? charCode + 32 : charCode;
|
|
303
|
+
return valueLower === charLower;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Check if identifier is "and" keyword
|
|
307
|
+
*/
|
|
308
|
+
isKeywordAnd(value, length) {
|
|
309
|
+
return length === 3 && this.firstCharMatches(value, "a") && this.equalsIgnoreCase(value, "and");
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Check if identifier is "or" keyword
|
|
313
|
+
*/
|
|
314
|
+
isKeywordOr(value, length) {
|
|
315
|
+
return length === 2 && this.firstCharMatches(value, "o") && this.equalsIgnoreCase(value, "or");
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Check if identifier is "not" keyword
|
|
319
|
+
*/
|
|
320
|
+
isKeywordNot(value, length) {
|
|
321
|
+
return length === 3 && this.firstCharMatches(value, "n") && this.equalsIgnoreCase(value, "not");
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Check if identifier is "in" keyword
|
|
325
|
+
*/
|
|
326
|
+
isKeywordIn(value, length) {
|
|
327
|
+
return length === 2 && this.firstCharMatches(value, "i") && this.equalsIgnoreCase(value, "in");
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Check if identifier is "is" keyword
|
|
331
|
+
*/
|
|
332
|
+
isKeywordIs(value, length) {
|
|
333
|
+
return length === 2 && this.firstCharMatches(value, "i") && this.equalsIgnoreCase(value, "is");
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Check if identifier is boolean keyword ("true" or "false")
|
|
337
|
+
*/
|
|
338
|
+
isKeywordBoolean(value) {
|
|
339
|
+
return this.equalsIgnoreCase(value, "true") || this.equalsIgnoreCase(value, "false");
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Check if identifier is null keyword ("null" or "empty")
|
|
343
|
+
*/
|
|
344
|
+
isKeywordNull(value) {
|
|
345
|
+
return this.equalsIgnoreCase(value, "null") || this.equalsIgnoreCase(value, "empty");
|
|
346
|
+
}
|
|
347
|
+
currentChar() {
|
|
348
|
+
return this.input[this.position] || "";
|
|
349
|
+
}
|
|
350
|
+
peek() {
|
|
351
|
+
return this.input[this.position + 1] || "";
|
|
352
|
+
}
|
|
353
|
+
advance() {
|
|
354
|
+
this.position++;
|
|
355
|
+
}
|
|
356
|
+
match(str) {
|
|
357
|
+
if (this.position + str.length > this.input.length) {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
for (let i = 0; i < str.length; i++) {
|
|
361
|
+
if (this.input[this.position + i] !== str[i]) {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
this.position += str.length;
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
isWhitespace(char) {
|
|
369
|
+
if (!char) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
const code = char.charCodeAt(0);
|
|
373
|
+
return (code === 0x20 || // space
|
|
374
|
+
code === 0x09 || // tab
|
|
375
|
+
code === 0x0a || // newline
|
|
376
|
+
code === 0x0d || // carriage return
|
|
377
|
+
code === 0x0c // form feed
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
isDigit(char) {
|
|
381
|
+
if (!char) {
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
const code = char.charCodeAt(0);
|
|
385
|
+
return code >= 0x30 && code <= 0x39; // '0' to '9'
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Checks if character can start an identifier.
|
|
389
|
+
* Supports: Latin letters (a-z, A-Z) and underscore (_).
|
|
390
|
+
*/
|
|
391
|
+
isIdentifierStart(char) {
|
|
392
|
+
if (!char) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
const code = char.charCodeAt(0);
|
|
396
|
+
return ((code >= 0x41 && code <= 0x5a) || // A-Z
|
|
397
|
+
(code >= 0x61 && code <= 0x7a) || // a-z
|
|
398
|
+
code === 0x5f // _
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Checks if character can be part of an identifier.
|
|
403
|
+
* Supports: Latin letters (a-z, A-Z) and underscore (_).
|
|
404
|
+
*/
|
|
405
|
+
isIdentifierChar(char) {
|
|
406
|
+
if (!char) {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
const code = char.charCodeAt(0);
|
|
410
|
+
return ((code >= 0x41 && code <= 0x5a) || // A-Z
|
|
411
|
+
(code >= 0x61 && code <= 0x7a) || // a-z
|
|
412
|
+
code === 0x5f // _
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tokenizer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AqlArrayConditionExpression, AqlBinaryExpression, AqlConditionExpression, AqlExpression, AqlNotExpression, AqlParenExpression, AqlParserConfig } from "../model.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if AQL is empty or includes all records.
|
|
4
|
+
*
|
|
5
|
+
* @param aql - The AQL string to check
|
|
6
|
+
* @returns `true` if AQL is empty, null, undefined, or equals "true"
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* if (includesAll(aql)) {
|
|
11
|
+
* // Return all records without filtering
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function includesAll(aql: string | null | undefined): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Converts AQL expression to string (reverse transformation).
|
|
18
|
+
*
|
|
19
|
+
* @param expression - The AQL expression to convert
|
|
20
|
+
* @returns AQL string representation of the expression
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const expr = parseAql('status = "passed"').expression;
|
|
25
|
+
* const aqlString = expressionToString(expr); // 'status = "passed"'
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function expressionToString(expression: AqlExpression): string;
|
|
29
|
+
/**
|
|
30
|
+
* Type helper for AQL expression
|
|
31
|
+
*/
|
|
32
|
+
export declare function aqlExpression(expression: AqlExpression): AqlExpression;
|
|
33
|
+
/**
|
|
34
|
+
* Type helper for AQL condition expression
|
|
35
|
+
*/
|
|
36
|
+
export declare function aqlConditionExpression(expression: AqlConditionExpression): AqlConditionExpression;
|
|
37
|
+
/**
|
|
38
|
+
* Type helper for AQL array condition expression
|
|
39
|
+
*/
|
|
40
|
+
export declare function aqlArrayConditionExpression(expression: AqlArrayConditionExpression): AqlArrayConditionExpression;
|
|
41
|
+
/**
|
|
42
|
+
* Type helper for AQL binary expression
|
|
43
|
+
*/
|
|
44
|
+
export declare function aqlBinaryExpression(expression: AqlBinaryExpression): AqlBinaryExpression;
|
|
45
|
+
/**
|
|
46
|
+
* Type helper for AQL not expression
|
|
47
|
+
*/
|
|
48
|
+
export declare function aqlNotExpression(expression: AqlNotExpression): AqlNotExpression;
|
|
49
|
+
/**
|
|
50
|
+
* Type helper for AQL paren expression
|
|
51
|
+
*/
|
|
52
|
+
export declare function aqlParenExpression(expression: AqlParenExpression): AqlParenExpression;
|
|
53
|
+
/**
|
|
54
|
+
* Type helper for AQL parser config
|
|
55
|
+
*/
|
|
56
|
+
export declare function aqlParserConfig(config: AqlParserConfig): AqlParserConfig;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for working with AQL
|
|
3
|
+
*/
|
|
4
|
+
import { AqlOperation, AqlOperationAliases } from "../model.js";
|
|
5
|
+
/**
|
|
6
|
+
* Checks if AQL is empty or includes all records.
|
|
7
|
+
*
|
|
8
|
+
* @param aql - The AQL string to check
|
|
9
|
+
* @returns `true` if AQL is empty, null, undefined, or equals "true"
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* if (includesAll(aql)) {
|
|
14
|
+
* // Return all records without filtering
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function includesAll(aql) {
|
|
19
|
+
if (!aql || aql.trim() === "") {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
const lowerAql = aql.toLowerCase().trim();
|
|
23
|
+
return lowerAql === "true";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Converts AQL expression to string (reverse transformation).
|
|
27
|
+
*
|
|
28
|
+
* @param expression - The AQL expression to convert
|
|
29
|
+
* @returns AQL string representation of the expression
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const expr = parseAql('status = "passed"').expression;
|
|
34
|
+
* const aqlString = expressionToString(expr); // 'status = "passed"'
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function expressionToString(expression) {
|
|
38
|
+
switch (expression.type) {
|
|
39
|
+
case "condition":
|
|
40
|
+
// eslint-disable-next-line max-len
|
|
41
|
+
return `${accessorToString(expression.left)} ${operationToString(expression.operator)} ${valueToString(expression.right)}`;
|
|
42
|
+
case "arrayCondition":
|
|
43
|
+
// eslint-disable-next-line max-len
|
|
44
|
+
return `${accessorToString(expression.left)} ${expression.operator} [${expression.right.map(valueToString).join(", ")}]`;
|
|
45
|
+
case "binary": {
|
|
46
|
+
const leftStr = expressionToString(expression.left);
|
|
47
|
+
const rightStr = expressionToString(expression.right);
|
|
48
|
+
return `${leftStr} ${expression.operator} ${rightStr}`;
|
|
49
|
+
}
|
|
50
|
+
case "not":
|
|
51
|
+
return `NOT ${expressionToString(expression.expression)}`;
|
|
52
|
+
case "paren":
|
|
53
|
+
return `(${expressionToString(expression.expression)})`;
|
|
54
|
+
case "boolean":
|
|
55
|
+
return expression.value ? "true" : "false";
|
|
56
|
+
default:
|
|
57
|
+
return "";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function accessorToString(accessor) {
|
|
61
|
+
if (accessor.param) {
|
|
62
|
+
if (accessor.param.type === "string") {
|
|
63
|
+
/**
|
|
64
|
+
* Escape backslashes and quotes in string values (consistent with valueToString)
|
|
65
|
+
*/
|
|
66
|
+
const escapedValue = String(accessor.param.value).replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
67
|
+
return `${accessor.identifier}["${escapedValue}"]`;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return `${accessor.identifier}[${accessor.param.value}]`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return accessor.identifier;
|
|
74
|
+
}
|
|
75
|
+
const operatorsMap = {
|
|
76
|
+
...AqlOperationAliases,
|
|
77
|
+
[AqlOperation.IN]: "IN",
|
|
78
|
+
};
|
|
79
|
+
function operationToString(op) {
|
|
80
|
+
return operatorsMap[op] || op;
|
|
81
|
+
}
|
|
82
|
+
function valueToString(value) {
|
|
83
|
+
switch (value.type) {
|
|
84
|
+
case "STRING":
|
|
85
|
+
/**
|
|
86
|
+
* Escape quotes and backslashes in string values
|
|
87
|
+
*/
|
|
88
|
+
// eslint-disable-next-line no-case-declarations
|
|
89
|
+
const escaped = value.value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
90
|
+
return `"${escaped}"`;
|
|
91
|
+
case "NULL":
|
|
92
|
+
return "null";
|
|
93
|
+
default:
|
|
94
|
+
return value.value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Type helper for AQL expression
|
|
99
|
+
*/
|
|
100
|
+
export function aqlExpression(expression) {
|
|
101
|
+
return expression;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Type helper for AQL condition expression
|
|
105
|
+
*/
|
|
106
|
+
export function aqlConditionExpression(expression) {
|
|
107
|
+
return expression;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Type helper for AQL array condition expression
|
|
111
|
+
*/
|
|
112
|
+
export function aqlArrayConditionExpression(expression) {
|
|
113
|
+
return expression;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Type helper for AQL binary expression
|
|
117
|
+
*/
|
|
118
|
+
export function aqlBinaryExpression(expression) {
|
|
119
|
+
return expression;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Type helper for AQL not expression
|
|
123
|
+
*/
|
|
124
|
+
export function aqlNotExpression(expression) {
|
|
125
|
+
return expression;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Type helper for AQL paren expression
|
|
129
|
+
*/
|
|
130
|
+
export function aqlParenExpression(expression) {
|
|
131
|
+
return expression;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Type helper for AQL parser config
|
|
135
|
+
*/
|
|
136
|
+
export function aqlParserConfig(config) {
|
|
137
|
+
return config;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|