@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.
@@ -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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"}