@abyss-project/main 18.1.0 → 18.2.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 (37) hide show
  1. package/dist/explore/expression.bounds.d.ts +7 -0
  2. package/dist/explore/expression.bounds.js +17 -0
  3. package/dist/explore/expression.bounds.js.map +1 -0
  4. package/dist/explore/expression.parser.d.ts +7 -0
  5. package/dist/explore/expression.parser.js +412 -0
  6. package/dist/explore/expression.parser.js.map +1 -0
  7. package/dist/explore/expression.tokenizer.d.ts +59 -0
  8. package/dist/explore/expression.tokenizer.js +246 -0
  9. package/dist/explore/expression.tokenizer.js.map +1 -0
  10. package/dist/explore/expression.types.d.ts +58 -0
  11. package/dist/explore/expression.types.js +36 -0
  12. package/dist/explore/expression.types.js.map +1 -0
  13. package/dist/explore/index.d.ts +4 -0
  14. package/dist/explore/index.js +24 -0
  15. package/dist/explore/index.js.map +1 -0
  16. package/dist/explore/tests/expression.parser.spec.d.ts +1 -0
  17. package/dist/explore/tests/expression.parser.spec.js +228 -0
  18. package/dist/explore/tests/expression.parser.spec.js.map +1 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/server/explore/field-catalog.types.d.ts +21 -0
  23. package/dist/server/explore/field-catalog.types.js +12 -0
  24. package/dist/server/explore/field-catalog.types.js.map +1 -0
  25. package/dist/server/explore/like-escape.d.ts +1 -0
  26. package/dist/server/explore/like-escape.js +7 -0
  27. package/dist/server/explore/like-escape.js.map +1 -0
  28. package/dist/server/explore/sql-translator.d.ts +18 -0
  29. package/dist/server/explore/sql-translator.js +265 -0
  30. package/dist/server/explore/sql-translator.js.map +1 -0
  31. package/dist/server/explore/tests/sql-translator.spec.d.ts +1 -0
  32. package/dist/server/explore/tests/sql-translator.spec.js +281 -0
  33. package/dist/server/explore/tests/sql-translator.spec.js.map +1 -0
  34. package/dist/server/index.d.ts +3 -0
  35. package/dist/server/index.js +3 -0
  36. package/dist/server/index.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExpressionSyntaxError = exports.ExpressionKeyword = exports.ExpressionTokenType = void 0;
4
+ exports.tokenizeExpression = tokenizeExpression;
5
+ const expression_types_1 = require("./expression.types");
6
+ var ExpressionTokenType;
7
+ (function (ExpressionTokenType) {
8
+ ExpressionTokenType["WORD"] = "WORD";
9
+ ExpressionTokenType["QUOTED"] = "QUOTED";
10
+ ExpressionTokenType["FIELD"] = "FIELD";
11
+ ExpressionTokenType["COMPARATOR"] = "COMPARATOR";
12
+ ExpressionTokenType["REGEX"] = "REGEX";
13
+ ExpressionTokenType["KEYWORD"] = "KEYWORD";
14
+ ExpressionTokenType["MINUS"] = "MINUS";
15
+ ExpressionTokenType["LPAREN"] = "LPAREN";
16
+ ExpressionTokenType["RPAREN"] = "RPAREN";
17
+ ExpressionTokenType["LBRACKET"] = "LBRACKET";
18
+ ExpressionTokenType["RBRACKET"] = "RBRACKET";
19
+ ExpressionTokenType["EOF"] = "EOF";
20
+ })(ExpressionTokenType || (exports.ExpressionTokenType = ExpressionTokenType = {}));
21
+ var ExpressionKeyword;
22
+ (function (ExpressionKeyword) {
23
+ ExpressionKeyword["AND"] = "AND";
24
+ ExpressionKeyword["OR"] = "OR";
25
+ ExpressionKeyword["NOT"] = "NOT";
26
+ ExpressionKeyword["TO"] = "TO";
27
+ })(ExpressionKeyword || (exports.ExpressionKeyword = ExpressionKeyword = {}));
28
+ class ExpressionSyntaxError extends Error {
29
+ constructor(position, expected, message) {
30
+ super(message);
31
+ this.position = position;
32
+ this.expected = expected;
33
+ this.name = 'ExpressionSyntaxError';
34
+ }
35
+ }
36
+ exports.ExpressionSyntaxError = ExpressionSyntaxError;
37
+ var LexerMode;
38
+ (function (LexerMode) {
39
+ LexerMode["NORMAL"] = "NORMAL";
40
+ LexerMode["AFTER_FIELD"] = "AFTER_FIELD";
41
+ LexerMode["VALUE_GROUP"] = "VALUE_GROUP";
42
+ })(LexerMode || (LexerMode = {}));
43
+ const WHITESPACE = /\s/;
44
+ const WORD_BREAKS = new Set(['(', ')', '[', ']', '"']);
45
+ const NORMAL_KEYWORDS = new Set([
46
+ ExpressionKeyword.AND,
47
+ ExpressionKeyword.OR,
48
+ ExpressionKeyword.NOT,
49
+ ]);
50
+ const GROUP_KEYWORDS = new Set([
51
+ ExpressionKeyword.AND,
52
+ ExpressionKeyword.OR,
53
+ ExpressionKeyword.NOT,
54
+ ExpressionKeyword.TO,
55
+ ]);
56
+ function isWhitespace(char) {
57
+ return WHITESPACE.test(char);
58
+ }
59
+ function tokenizeExpression(text) {
60
+ const tokens = [];
61
+ const length = text.length;
62
+ let index = 0;
63
+ let mode = LexerMode.NORMAL;
64
+ let afterFieldToken = false;
65
+ const readQuoted = () => {
66
+ const start = index;
67
+ index += 1;
68
+ let value = '';
69
+ while (index < length) {
70
+ const char = text[index];
71
+ if (char === '\\' && index + 1 < length) {
72
+ value += text[index + 1];
73
+ index += 2;
74
+ continue;
75
+ }
76
+ if (char === '"') {
77
+ index += 1;
78
+ tokens.push({ type: ExpressionTokenType.QUOTED, position: start, end: index, value });
79
+ return;
80
+ }
81
+ value += char;
82
+ index += 1;
83
+ }
84
+ throw new ExpressionSyntaxError(length, expression_types_1.ExpressionExpected.CLOSING_QUOTE, `Missing closing quote for the phrase opened at ${start}`);
85
+ };
86
+ const readRegex = () => {
87
+ const start = index;
88
+ index += 1;
89
+ let pattern = '';
90
+ while (index < length) {
91
+ const char = text[index];
92
+ if (char === '\\' && index + 1 < length) {
93
+ const next = text[index + 1];
94
+ pattern += next === '/' ? '/' : `\\${next}`;
95
+ index += 2;
96
+ continue;
97
+ }
98
+ if (char === '/') {
99
+ index += 1;
100
+ tokens.push({ type: ExpressionTokenType.REGEX, position: start, end: index, pattern });
101
+ return;
102
+ }
103
+ pattern += char;
104
+ index += 1;
105
+ }
106
+ throw new ExpressionSyntaxError(length, expression_types_1.ExpressionExpected.CLOSING_QUOTE, `Missing closing "/" for the regular expression opened at ${start}`);
107
+ };
108
+ const readWord = (splitOnColon, keywords) => {
109
+ const start = index;
110
+ const units = [];
111
+ while (index < length) {
112
+ const char = text[index];
113
+ if (char === '\\') {
114
+ const escapedChar = index + 1 < length ? text[index + 1] : '\\';
115
+ units.push({ char: escapedChar, escaped: true });
116
+ index += index + 1 < length ? 2 : 1;
117
+ continue;
118
+ }
119
+ if (isWhitespace(char) || WORD_BREAKS.has(char)) {
120
+ break;
121
+ }
122
+ if (splitOnColon && char === ':') {
123
+ if (units.length === 0 || units.some((unit) => unit.escaped)) {
124
+ throw new ExpressionSyntaxError(start, expression_types_1.ExpressionExpected.FIELD, 'A field name is expected before ":"');
125
+ }
126
+ const raw = units.map((unit) => unit.char).join('');
127
+ const attribute = raw.startsWith('@');
128
+ index += 1;
129
+ tokens.push({
130
+ type: ExpressionTokenType.FIELD,
131
+ position: start,
132
+ end: index,
133
+ name: attribute ? raw.slice(1) : raw,
134
+ attribute,
135
+ });
136
+ mode = LexerMode.AFTER_FIELD;
137
+ afterFieldToken = true;
138
+ return;
139
+ }
140
+ units.push({ char, escaped: false });
141
+ index += 1;
142
+ }
143
+ if (units.length === 0) {
144
+ return;
145
+ }
146
+ const raw = units.map((unit) => unit.char).join('');
147
+ if (keywords && keywords.has(raw) && units.every((unit) => !unit.escaped)) {
148
+ tokens.push({
149
+ type: ExpressionTokenType.KEYWORD,
150
+ position: start,
151
+ end: index,
152
+ keyword: raw,
153
+ });
154
+ return;
155
+ }
156
+ tokens.push({ type: ExpressionTokenType.WORD, position: start, end: index, units });
157
+ };
158
+ const pushSingle = (type) => {
159
+ tokens.push({ type, position: index, end: index + 1 });
160
+ index += 1;
161
+ };
162
+ while (true) {
163
+ if (mode === LexerMode.AFTER_FIELD) {
164
+ const char = index < length ? text[index] : '';
165
+ const wasFieldToken = afterFieldToken;
166
+ afterFieldToken = false;
167
+ if (char === '' || isWhitespace(char) || char === ')' || char === ']') {
168
+ mode = LexerMode.NORMAL;
169
+ continue;
170
+ }
171
+ if (wasFieldToken && char === '/') {
172
+ readRegex();
173
+ mode = LexerMode.NORMAL;
174
+ continue;
175
+ }
176
+ if (wasFieldToken && (char === '>' || char === '<')) {
177
+ const withEqual = text[index + 1] === '=';
178
+ const operator = char === '>'
179
+ ? withEqual
180
+ ? expression_types_1.ExpressionOperator.GTE
181
+ : expression_types_1.ExpressionOperator.GT
182
+ : withEqual
183
+ ? expression_types_1.ExpressionOperator.LTE
184
+ : expression_types_1.ExpressionOperator.LT;
185
+ const width = withEqual ? 2 : 1;
186
+ tokens.push({
187
+ type: ExpressionTokenType.COMPARATOR,
188
+ position: index,
189
+ end: index + width,
190
+ operator,
191
+ });
192
+ index += width;
193
+ continue;
194
+ }
195
+ if (char === '(' || char === '[') {
196
+ pushSingle(char === '(' ? ExpressionTokenType.LPAREN : ExpressionTokenType.LBRACKET);
197
+ mode = LexerMode.VALUE_GROUP;
198
+ continue;
199
+ }
200
+ if (char === '"') {
201
+ readQuoted();
202
+ }
203
+ else {
204
+ readWord(false, null);
205
+ }
206
+ mode = LexerMode.NORMAL;
207
+ continue;
208
+ }
209
+ while (index < length && isWhitespace(text[index])) {
210
+ index += 1;
211
+ }
212
+ if (index >= length) {
213
+ tokens.push({ type: ExpressionTokenType.EOF, position: length, end: length });
214
+ return tokens;
215
+ }
216
+ const char = text[index];
217
+ if (char === '(') {
218
+ pushSingle(ExpressionTokenType.LPAREN);
219
+ }
220
+ else if (char === ')' || char === ']') {
221
+ pushSingle(char === ')' ? ExpressionTokenType.RPAREN : ExpressionTokenType.RBRACKET);
222
+ if (mode === LexerMode.VALUE_GROUP) {
223
+ mode = LexerMode.NORMAL;
224
+ }
225
+ }
226
+ else if (char === '[') {
227
+ pushSingle(ExpressionTokenType.LBRACKET);
228
+ }
229
+ else if (char === '"') {
230
+ readQuoted();
231
+ }
232
+ else if (mode === LexerMode.NORMAL &&
233
+ char === '-' &&
234
+ index + 1 < length &&
235
+ !isWhitespace(text[index + 1])) {
236
+ pushSingle(ExpressionTokenType.MINUS);
237
+ }
238
+ else if (mode === LexerMode.VALUE_GROUP) {
239
+ readWord(false, GROUP_KEYWORDS);
240
+ }
241
+ else {
242
+ readWord(true, NORMAL_KEYWORDS);
243
+ }
244
+ }
245
+ }
246
+ //# sourceMappingURL=expression.tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.tokenizer.js","sourceRoot":"","sources":["../../src/explore/expression.tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export declare enum ExpressionNodeKind {
2
+ AND = "AND",
3
+ OR = "OR",
4
+ NOT = "NOT",
5
+ TERM = "TERM",
6
+ TEXT = "TEXT"
7
+ }
8
+ export declare enum ExpressionOperator {
9
+ EQ = "EQ",
10
+ GT = "GT",
11
+ GTE = "GTE",
12
+ LT = "LT",
13
+ LTE = "LTE",
14
+ RANGE = "RANGE",
15
+ IN = "IN",
16
+ PREFIX = "PREFIX",
17
+ CONTAINS = "CONTAINS",
18
+ EXISTS = "EXISTS",
19
+ REGEX = "REGEX"
20
+ }
21
+ export type ExpressionNode = {
22
+ kind: ExpressionNodeKind.AND | ExpressionNodeKind.OR;
23
+ children: ExpressionNode[];
24
+ } | {
25
+ kind: ExpressionNodeKind.NOT;
26
+ child: ExpressionNode;
27
+ } | {
28
+ kind: ExpressionNodeKind.TERM;
29
+ field: string;
30
+ attribute: boolean;
31
+ operator: ExpressionOperator;
32
+ values: string[];
33
+ } | {
34
+ kind: ExpressionNodeKind.TEXT;
35
+ value: string;
36
+ phrase: boolean;
37
+ };
38
+ export declare enum ExpressionExpected {
39
+ VALUE = "VALUE",
40
+ FIELD = "FIELD",
41
+ CLOSING_PAREN = "CLOSING_PAREN",
42
+ CLOSING_BRACKET = "CLOSING_BRACKET",
43
+ CLOSING_QUOTE = "CLOSING_QUOTE",
44
+ OPERAND = "OPERAND",
45
+ END = "END"
46
+ }
47
+ export interface IExpressionError {
48
+ position: number;
49
+ expected: ExpressionExpected;
50
+ message: string;
51
+ }
52
+ export type ParseExpressionResult = {
53
+ ok: true;
54
+ ast: ExpressionNode | null;
55
+ } | {
56
+ ok: false;
57
+ error: IExpressionError;
58
+ };
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExpressionExpected = exports.ExpressionOperator = exports.ExpressionNodeKind = void 0;
4
+ var ExpressionNodeKind;
5
+ (function (ExpressionNodeKind) {
6
+ ExpressionNodeKind["AND"] = "AND";
7
+ ExpressionNodeKind["OR"] = "OR";
8
+ ExpressionNodeKind["NOT"] = "NOT";
9
+ ExpressionNodeKind["TERM"] = "TERM";
10
+ ExpressionNodeKind["TEXT"] = "TEXT";
11
+ })(ExpressionNodeKind || (exports.ExpressionNodeKind = ExpressionNodeKind = {}));
12
+ var ExpressionOperator;
13
+ (function (ExpressionOperator) {
14
+ ExpressionOperator["EQ"] = "EQ";
15
+ ExpressionOperator["GT"] = "GT";
16
+ ExpressionOperator["GTE"] = "GTE";
17
+ ExpressionOperator["LT"] = "LT";
18
+ ExpressionOperator["LTE"] = "LTE";
19
+ ExpressionOperator["RANGE"] = "RANGE";
20
+ ExpressionOperator["IN"] = "IN";
21
+ ExpressionOperator["PREFIX"] = "PREFIX";
22
+ ExpressionOperator["CONTAINS"] = "CONTAINS";
23
+ ExpressionOperator["EXISTS"] = "EXISTS";
24
+ ExpressionOperator["REGEX"] = "REGEX";
25
+ })(ExpressionOperator || (exports.ExpressionOperator = ExpressionOperator = {}));
26
+ var ExpressionExpected;
27
+ (function (ExpressionExpected) {
28
+ ExpressionExpected["VALUE"] = "VALUE";
29
+ ExpressionExpected["FIELD"] = "FIELD";
30
+ ExpressionExpected["CLOSING_PAREN"] = "CLOSING_PAREN";
31
+ ExpressionExpected["CLOSING_BRACKET"] = "CLOSING_BRACKET";
32
+ ExpressionExpected["CLOSING_QUOTE"] = "CLOSING_QUOTE";
33
+ ExpressionExpected["OPERAND"] = "OPERAND";
34
+ ExpressionExpected["END"] = "END";
35
+ })(ExpressionExpected || (exports.ExpressionExpected = ExpressionExpected = {}));
36
+ //# sourceMappingURL=expression.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.types.js","sourceRoot":"","sources":["../../src/explore/expression.types.ts"],"names":[],"mappings":";;;AAoBA,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,iCAAW,CAAA;IACX,+BAAS,CAAA;IACT,iCAAW,CAAA;IACX,mCAAa,CAAA;IACb,mCAAa,CAAA;AACf,CAAC,EANW,kBAAkB,kCAAlB,kBAAkB,QAM7B;AAED,IAAY,kBAYX;AAZD,WAAY,kBAAkB;IAC5B,+BAAS,CAAA;IACT,+BAAS,CAAA;IACT,iCAAW,CAAA;IACX,+BAAS,CAAA;IACT,iCAAW,CAAA;IACX,qCAAe,CAAA;IACf,+BAAS,CAAA;IACT,uCAAiB,CAAA;IACjB,2CAAqB,CAAA;IACrB,uCAAiB,CAAA;IACjB,qCAAe,CAAA;AACjB,CAAC,EAZW,kBAAkB,kCAAlB,kBAAkB,QAY7B;AAwBD,IAAY,kBAQX;AARD,WAAY,kBAAkB;IAC5B,qCAAe,CAAA;IACf,qCAAe,CAAA;IACf,qDAA+B,CAAA;IAC/B,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;IAC/B,yCAAmB,CAAA;IACnB,iCAAW,CAAA;AACb,CAAC,EARW,kBAAkB,kCAAlB,kBAAkB,QAQ7B"}
@@ -0,0 +1,4 @@
1
+ export * from './expression.types';
2
+ export * from './expression.bounds';
3
+ export { parseExpression, stringifyExpression, addTermToExpression } from './expression.parser';
4
+ export type { IParseExpressionOptions } from './expression.parser';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.addTermToExpression = exports.stringifyExpression = exports.parseExpression = void 0;
18
+ __exportStar(require("./expression.types"), exports);
19
+ __exportStar(require("./expression.bounds"), exports);
20
+ var expression_parser_1 = require("./expression.parser");
21
+ Object.defineProperty(exports, "parseExpression", { enumerable: true, get: function () { return expression_parser_1.parseExpression; } });
22
+ Object.defineProperty(exports, "stringifyExpression", { enumerable: true, get: function () { return expression_parser_1.stringifyExpression; } });
23
+ Object.defineProperty(exports, "addTermToExpression", { enumerable: true, get: function () { return expression_parser_1.addTermToExpression; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/explore/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,qDAAmC;AACnC,sDAAoC;AACpC,yDAAgG;AAAvF,oHAAA,eAAe,OAAA;AAAE,wHAAA,mBAAmB,OAAA;AAAE,wHAAA,mBAAmB,OAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const expression_bounds_1 = require("../expression.bounds");
4
+ const expression_parser_1 = require("../expression.parser");
5
+ const expression_types_1 = require("../expression.types");
6
+ const term = (field, operator, values, attribute = false) => ({ kind: expression_types_1.ExpressionNodeKind.TERM, field, attribute, operator, values });
7
+ const text = (value, phrase = false) => ({
8
+ kind: expression_types_1.ExpressionNodeKind.TEXT,
9
+ value,
10
+ phrase,
11
+ });
12
+ const and = (...children) => ({
13
+ kind: expression_types_1.ExpressionNodeKind.AND,
14
+ children,
15
+ });
16
+ const or = (...children) => ({
17
+ kind: expression_types_1.ExpressionNodeKind.OR,
18
+ children,
19
+ });
20
+ const not = (child) => ({ kind: expression_types_1.ExpressionNodeKind.NOT, child });
21
+ function parseOk(input, allowRegex = false) {
22
+ const result = (0, expression_parser_1.parseExpression)(input, { allowRegex });
23
+ if (!result.ok) {
24
+ throw new Error(`"${input}" did not parse: ${JSON.stringify(result.error)}`);
25
+ }
26
+ return result.ast;
27
+ }
28
+ function parseError(input, allowRegex = false) {
29
+ const result = (0, expression_parser_1.parseExpression)(input, { allowRegex });
30
+ if (result.ok) {
31
+ throw new Error(`"${input}" parsed: ${JSON.stringify(result.ast)}`);
32
+ }
33
+ return { position: result.error.position, expected: result.error.expected };
34
+ }
35
+ describe('parseExpression — every form of §3.1 (A1)', () => {
36
+ const cases = [
37
+ ['', null],
38
+ [' ', null],
39
+ ['timeout', text('timeout')],
40
+ ['"connection reset by peer"', text('connection reset by peer', true)],
41
+ ['level:ERROR', term('level', expression_types_1.ExpressionOperator.EQ, ['ERROR'])],
42
+ ['env:"my env"', term('env', expression_types_1.ExpressionOperator.EQ, ['my env'])],
43
+ ['@user.id:42', term('user.id', expression_types_1.ExpressionOperator.EQ, ['42'], true)],
44
+ ['@flag.dark-mode:on', term('flag.dark-mode', expression_types_1.ExpressionOperator.EQ, ['on'], true)],
45
+ ['release:1.2*', term('release', expression_types_1.ExpressionOperator.PREFIX, ['1.2'])],
46
+ ['message:*timeout*', term('message', expression_types_1.ExpressionOperator.CONTAINS, ['timeout'])],
47
+ ['status:>500', term('status', expression_types_1.ExpressionOperator.GT, ['500'])],
48
+ ['status:>=500', term('status', expression_types_1.ExpressionOperator.GTE, ['500'])],
49
+ ['status:<500', term('status', expression_types_1.ExpressionOperator.LT, ['500'])],
50
+ ['status:<=500', term('status', expression_types_1.ExpressionOperator.LTE, ['500'])],
51
+ ['status:[400 TO 499]', term('status', expression_types_1.ExpressionOperator.RANGE, ['400', '499'])],
52
+ [
53
+ 'createdAt:[2026-10-01 TO "2026-10-15T10:00:00Z"]',
54
+ term('createdAt', expression_types_1.ExpressionOperator.RANGE, ['2026-10-01', '2026-10-15T10:00:00Z']),
55
+ ],
56
+ [
57
+ 'level:(ERROR OR WARN OR "FATAL")',
58
+ term('level', expression_types_1.ExpressionOperator.IN, ['ERROR', 'WARN', 'FATAL']),
59
+ ],
60
+ ['-level:DEBUG', not(term('level', expression_types_1.ExpressionOperator.EQ, ['DEBUG']))],
61
+ ['NOT level:DEBUG', not(term('level', expression_types_1.ExpressionOperator.EQ, ['DEBUG']))],
62
+ ['-timeout', not(text('timeout'))],
63
+ ['release:*', term('release', expression_types_1.ExpressionOperator.EXISTS, [])],
64
+ ['a b', and(text('a'), text('b'))],
65
+ ['a AND b', and(text('a'), text('b'))],
66
+ ['a OR b', or(text('a'), text('b'))],
67
+ ['a b OR c', or(and(text('a'), text('b')), text('c'))],
68
+ ['a OR b c', or(text('a'), and(text('b'), text('c')))],
69
+ ['(a OR b) c', and(or(text('a'), text('b')), text('c'))],
70
+ ['-(a OR b)', not(or(text('a'), text('b')))],
71
+ ['a (b c)', and(text('a'), text('b'), text('c'))],
72
+ ['url:http://host/path', term('url', expression_types_1.ExpressionOperator.EQ, ['http://host/path'])],
73
+ ['path:a\\ b\\*', term('path', expression_types_1.ExpressionOperator.EQ, ['a b*'])],
74
+ ['a\\:b', text('a:b')],
75
+ ['\\OR', text('OR')],
76
+ ['level:OR', term('level', expression_types_1.ExpressionOperator.EQ, ['OR'])],
77
+ ['go TO school', and(text('go'), text('TO'), text('school'))],
78
+ ['a - b', and(text('a'), text('-'), text('b'))],
79
+ [
80
+ 'env:prod -level:DEBUG @user.id:* "boom"',
81
+ and(term('env', expression_types_1.ExpressionOperator.EQ, ['prod']), not(term('level', expression_types_1.ExpressionOperator.EQ, ['DEBUG'])), term('user.id', expression_types_1.ExpressionOperator.EXISTS, [], true), text('boom', true)),
82
+ ],
83
+ ];
84
+ it.each(cases)('parses %j', (input, expected) => {
85
+ expect(parseOk(input)).toEqual(expected);
86
+ });
87
+ it('parses a regex only with allowRegex (A26)', () => {
88
+ expect(parseError('message:/a+/')).toEqual({ position: 8, expected: expression_types_1.ExpressionExpected.VALUE });
89
+ expect(parseOk('message:/a+/', true)).toEqual(term('message', expression_types_1.ExpressionOperator.REGEX, ['a+']));
90
+ expect(parseOk('path:/a\\/b\\d/', true)).toEqual(term('path', expression_types_1.ExpressionOperator.REGEX, ['a/b\\d']));
91
+ });
92
+ });
93
+ describe('parseExpression — positioned errors (A1)', () => {
94
+ const cases = [
95
+ ['level:', 6, expression_types_1.ExpressionExpected.VALUE],
96
+ ['level: ERROR', 6, expression_types_1.ExpressionExpected.VALUE],
97
+ ['(a', 2, expression_types_1.ExpressionExpected.CLOSING_PAREN],
98
+ ['status:[1 TO', 12, expression_types_1.ExpressionExpected.VALUE],
99
+ ['status:[1 TO 2', 14, expression_types_1.ExpressionExpected.CLOSING_BRACKET],
100
+ ['status:[1 2]', 10, expression_types_1.ExpressionExpected.VALUE],
101
+ ['"abc', 4, expression_types_1.ExpressionExpected.CLOSING_QUOTE],
102
+ ['level:(a OR b', 13, expression_types_1.ExpressionExpected.CLOSING_PAREN],
103
+ ['a OR', 4, expression_types_1.ExpressionExpected.OPERAND],
104
+ ['AND a', 0, expression_types_1.ExpressionExpected.OPERAND],
105
+ ['()', 1, expression_types_1.ExpressionExpected.OPERAND],
106
+ ['a)', 1, expression_types_1.ExpressionExpected.END],
107
+ [':x', 0, expression_types_1.ExpressionExpected.FIELD],
108
+ ['@:x', 0, expression_types_1.ExpressionExpected.FIELD],
109
+ ['@a.b..c:x', 0, expression_types_1.ExpressionExpected.FIELD],
110
+ ['status:>', 8, expression_types_1.ExpressionExpected.VALUE],
111
+ ['release:*1', 8, expression_types_1.ExpressionExpected.VALUE],
112
+ ['release:a*b', 9, expression_types_1.ExpressionExpected.VALUE],
113
+ ['status:[* TO 5]', 8, expression_types_1.ExpressionExpected.VALUE],
114
+ ['message:/a+', 11, expression_types_1.ExpressionExpected.CLOSING_QUOTE],
115
+ ];
116
+ it.each(cases)('%j fails at %i', (input, position, expected) => {
117
+ expect(parseError(input)).toEqual({ position, expected });
118
+ });
119
+ it("refuses the trapped key of review n°1: @a'); DROP", () => {
120
+ expect((0, expression_parser_1.parseExpression)("@a'); DROP").ok).toBe(false);
121
+ expect(parseError("@a');DROP:x")).toEqual({ position: 3, expected: expression_types_1.ExpressionExpected.END });
122
+ expect(parseError("@a';DROP:x")).toEqual({ position: 0, expected: expression_types_1.ExpressionExpected.FIELD });
123
+ });
124
+ it('bounds the length', () => {
125
+ const input = 'a'.repeat(expression_bounds_1.EXPRESSION_BOUNDS.maxLength + 1);
126
+ expect(parseError(input)).toEqual({
127
+ position: expression_bounds_1.EXPRESSION_BOUNDS.maxLength,
128
+ expected: expression_types_1.ExpressionExpected.END,
129
+ });
130
+ expect((0, expression_parser_1.parseExpression)('a'.repeat(expression_bounds_1.EXPRESSION_BOUNDS.maxLength)).ok).toBe(true);
131
+ });
132
+ it('bounds the depth', () => {
133
+ const atLimit = `${'('.repeat(16)}a${')'.repeat(16)}`;
134
+ expect(parseOk(atLimit)).toEqual(text('a'));
135
+ const beyond = `${'('.repeat(17)}a${')'.repeat(17)}`;
136
+ expect(parseError(beyond)).toEqual({
137
+ position: 16,
138
+ expected: expression_types_1.ExpressionExpected.CLOSING_PAREN,
139
+ });
140
+ });
141
+ it('bounds the number of terms', () => {
142
+ const words = Array.from({ length: 50 }, (_, index) => `w${index}`);
143
+ expect((0, expression_parser_1.parseExpression)(words.join(' ')).ok).toBe(true);
144
+ const tooMany = [...words, 'level:x'].join(' ');
145
+ expect(parseError(tooMany)).toEqual({
146
+ position: words.join(' ').length + 1,
147
+ expected: expression_types_1.ExpressionExpected.END,
148
+ });
149
+ });
150
+ });
151
+ describe('stringifyExpression — round trip', () => {
152
+ const normalized = [
153
+ 'timeout',
154
+ '"connection reset"',
155
+ 'level:ERROR',
156
+ 'env:"my env"',
157
+ '@user.id:42',
158
+ '@flag.beta:on',
159
+ 'release:1.2*',
160
+ 'message:*time\\ out*',
161
+ 'status:>500',
162
+ 'status:>=500',
163
+ 'status:<-5',
164
+ 'status:<=500',
165
+ 'status:[400 TO 499]',
166
+ 'level:(ERROR OR WARN OR "two words")',
167
+ '-level:DEBUG',
168
+ 'release:*',
169
+ 'a b OR c',
170
+ '(a OR b) c',
171
+ '-(a OR b) -"x y"',
172
+ 'path:\\/root a\\:b \\OR level:(\\TO OR x) msg:\\*',
173
+ 'message:/a\\/b+/',
174
+ ];
175
+ it.each(normalized)('stringify(parse(%j)) gives it back', (input) => {
176
+ const ast = parseOk(input, true);
177
+ expect((0, expression_parser_1.stringifyExpression)(ast)).toBe(input);
178
+ expect(parseOk((0, expression_parser_1.stringifyExpression)(ast), true)).toEqual(ast);
179
+ });
180
+ it('normalizes NOT and explicit AND', () => {
181
+ expect((0, expression_parser_1.stringifyExpression)(parseOk('NOT a AND b'))).toBe('-a b');
182
+ expect((0, expression_parser_1.stringifyExpression)(null)).toBe('');
183
+ });
184
+ });
185
+ describe('addTermToExpression', () => {
186
+ it('adds a filter to an empty expression', () => {
187
+ expect((0, expression_parser_1.addTermToExpression)('', 'level', 'ERROR', false)).toBe('level:ERROR');
188
+ });
189
+ it('adds an exclusion with a quoted value', () => {
190
+ expect((0, expression_parser_1.addTermToExpression)('env:prod', 'release', 'v 2', true)).toBe('env:prod -release:"v 2"');
191
+ });
192
+ it('adds an attribute', () => {
193
+ expect((0, expression_parser_1.addTermToExpression)('a', '@user.id', '42', false)).toBe('a @user.id:42');
194
+ });
195
+ it('does not duplicate an existing term', () => {
196
+ expect((0, expression_parser_1.addTermToExpression)('level:ERROR env:prod', 'level', 'ERROR', false)).toBe('level:ERROR env:prod');
197
+ expect((0, expression_parser_1.addTermToExpression)('-level:ERROR', 'level', 'ERROR', true)).toBe('-level:ERROR');
198
+ });
199
+ it('replaces the opposite term', () => {
200
+ expect((0, expression_parser_1.addTermToExpression)('-level:ERROR env:prod', 'level', 'ERROR', false)).toBe('env:prod level:ERROR');
201
+ expect((0, expression_parser_1.addTermToExpression)('level:ERROR', 'level', 'ERROR', true)).toBe('-level:ERROR');
202
+ });
203
+ it('keeps an OR together', () => {
204
+ expect((0, expression_parser_1.addTermToExpression)('a OR b', 'level', 'ERROR', false)).toBe('(a OR b) level:ERROR');
205
+ });
206
+ it('keeps an unparsable input and appends the term', () => {
207
+ expect((0, expression_parser_1.addTermToExpression)('(a ', 'level', 'ERROR', false)).toBe('(a level:ERROR');
208
+ });
209
+ it('throws on an invalid field name', () => {
210
+ expect(() => (0, expression_parser_1.addTermToExpression)('', "@a');DROP", 'x', false)).toThrow(/invalid field name/);
211
+ });
212
+ });
213
+ describe('isValidAttributeKey', () => {
214
+ it.each([
215
+ ['user.id', true],
216
+ ['flag.dark-mode', true],
217
+ ['a'.repeat(64), true],
218
+ ['a'.repeat(65), false],
219
+ ['a.b..c', false],
220
+ ['.a', false],
221
+ ['a.', false],
222
+ ["a');DROP", false],
223
+ ['', false],
224
+ ])('%j -> %s', (key, valid) => {
225
+ expect((0, expression_bounds_1.isValidAttributeKey)(key)).toBe(valid);
226
+ });
227
+ });
228
+ //# sourceMappingURL=expression.parser.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.parser.spec.js","sourceRoot":"","sources":["../../../src/explore/tests/expression.parser.spec.ts"],"names":[],"mappings":"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"}