@opra/common 0.17.1 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/browser.js +12220 -0
  2. package/cjs/document/data-type/complex-type.js +1 -1
  3. package/cjs/document/resource/collection.js +13 -7
  4. package/cjs/filter/antlr/OpraFilterLexer.js +209 -238
  5. package/cjs/filter/antlr/OpraFilterListener.js +1 -1
  6. package/cjs/filter/antlr/OpraFilterParser.js +795 -1482
  7. package/cjs/filter/antlr/OpraFilterVisitor.js +1 -1
  8. package/cjs/filter/ast/expressions/logical-expression.js +4 -0
  9. package/cjs/filter/ast/expressions/{parentheses-expression.js → negative-expression.js} +3 -3
  10. package/cjs/filter/ast/expressions/parenthesized-expression.js +14 -0
  11. package/cjs/filter/ast/index.js +2 -1
  12. package/cjs/filter/build.js +1 -1
  13. package/cjs/filter/filter-tree-visitor.js +44 -66
  14. package/cjs/filter/index.js +2 -5
  15. package/cjs/filter/opra-filter.ns.js +8 -0
  16. package/cjs/filter/parse.js +5 -6
  17. package/cjs/http/codecs/filter-codec.js +2 -2
  18. package/cjs/http/http-message.host.js +6 -6
  19. package/cjs/http/http-request-message.js +3 -3
  20. package/cjs/http/http-response-message.js +2 -2
  21. package/cjs/http/multipart/batch-multipart.js +1 -1
  22. package/cjs/i18n/i18n.js +1 -1
  23. package/esm/document/data-type/complex-type.js +1 -1
  24. package/esm/document/resource/collection.js +14 -8
  25. package/esm/filter/antlr/OpraFilterLexer.js +209 -238
  26. package/esm/filter/antlr/OpraFilterListener.js +1 -1
  27. package/esm/filter/antlr/OpraFilterParser.js +775 -1448
  28. package/esm/filter/antlr/OpraFilterVisitor.js +1 -1
  29. package/esm/filter/ast/expressions/logical-expression.js +4 -0
  30. package/esm/filter/ast/expressions/{parentheses-expression.js → negative-expression.js} +1 -1
  31. package/esm/filter/ast/expressions/parenthesized-expression.js +10 -0
  32. package/esm/filter/ast/index.js +2 -1
  33. package/esm/filter/build.js +2 -2
  34. package/esm/filter/filter-tree-visitor.js +46 -68
  35. package/esm/filter/index.js +1 -5
  36. package/esm/filter/opra-filter.ns.js +5 -0
  37. package/esm/filter/parse.js +3 -4
  38. package/esm/http/codecs/filter-codec.js +2 -2
  39. package/esm/http/http-message.host.js +1 -1
  40. package/esm/http/http-request-message.js +1 -1
  41. package/esm/http/http-response-message.js +1 -1
  42. package/esm/http/multipart/batch-multipart.js +1 -1
  43. package/esm/i18n/i18n.js +1 -1
  44. package/package.json +29 -17
  45. package/types/document/resource/collection.d.ts +2 -2
  46. package/types/filter/antlr/OpraFilterLexer.d.ts +9 -22
  47. package/types/filter/antlr/OpraFilterListener.d.ts +89 -217
  48. package/types/filter/antlr/OpraFilterParser.d.ts +91 -206
  49. package/types/filter/antlr/OpraFilterVisitor.d.ts +49 -124
  50. package/types/filter/ast/expressions/{parentheses-expression.d.ts → negative-expression.d.ts} +1 -1
  51. package/types/filter/ast/expressions/parenthesized-expression.d.ts +6 -0
  52. package/types/filter/ast/index.d.ts +2 -1
  53. package/types/filter/build.d.ts +2 -2
  54. package/types/filter/filter-tree-visitor.d.ts +10 -11
  55. package/types/filter/index.d.ts +1 -5
  56. package/types/filter/opra-filter.ns.d.ts +5 -0
  57. package/types/filter/parse.d.ts +1 -1
  58. package/types/http/http-message.host.d.ts +1 -1
  59. package/types/i18n/i18n.d.ts +2 -2
  60. package/types/i18n/translate.d.ts +1 -1
  61. package/types/schema/data-type/complex-type.interface.d.ts +1 -1
  62. package/types/schema/resource/endpoint.interface.d.ts +2 -2
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
+ // Generated from ./src/filter/antlr/OpraFilter.g4 by ANTLR 4.12.0
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // Generated from ./src/filter/antlr/OpraFilter.g4 by ANTLR 4.11.2-SNAPSHOT
4
4
  const antlr4_1 = require("@browsery/antlr4");
5
5
  /**
6
6
  * This interface defines a complete generic visitor for a parse tree produced
@@ -6,6 +6,10 @@ class LogicalExpression extends expression_js_1.Expression {
6
6
  constructor(o) {
7
7
  super();
8
8
  Object.assign(this, o);
9
+ if (this.op === '&&')
10
+ this.op = 'and';
11
+ if (this.op === '||')
12
+ this.op = 'or';
9
13
  }
10
14
  toString() {
11
15
  return this.items
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParenthesesExpression = void 0;
3
+ exports.NegativeExpression = void 0;
4
4
  const expression_js_1 = require("../abstract/expression.js");
5
- class ParenthesesExpression extends expression_js_1.Expression {
5
+ class NegativeExpression extends expression_js_1.Expression {
6
6
  constructor(expression) {
7
7
  super();
8
8
  this.expression = expression;
@@ -11,4 +11,4 @@ class ParenthesesExpression extends expression_js_1.Expression {
11
11
  return `(${this.expression})`;
12
12
  }
13
13
  }
14
- exports.ParenthesesExpression = ParenthesesExpression;
14
+ exports.NegativeExpression = NegativeExpression;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParenthesizedExpression = void 0;
4
+ const expression_js_1 = require("../abstract/expression.js");
5
+ class ParenthesizedExpression extends expression_js_1.Expression {
6
+ constructor(expression) {
7
+ super();
8
+ this.expression = expression;
9
+ }
10
+ toString() {
11
+ return `(${this.expression})`;
12
+ }
13
+ }
14
+ exports.ParenthesizedExpression = ParenthesizedExpression;
@@ -9,7 +9,8 @@ tslib_1.__exportStar(require("./expressions/arithmetic-expression.js"), exports)
9
9
  tslib_1.__exportStar(require("./expressions/array-expression.js"), exports);
10
10
  tslib_1.__exportStar(require("./expressions/comparison-expression.js"), exports);
11
11
  tslib_1.__exportStar(require("./expressions/logical-expression.js"), exports);
12
- tslib_1.__exportStar(require("./expressions/parentheses-expression.js"), exports);
12
+ tslib_1.__exportStar(require("./expressions/parenthesized-expression.js"), exports);
13
+ tslib_1.__exportStar(require("./expressions/negative-expression.js"), exports);
13
14
  tslib_1.__exportStar(require("./terms/boolean-literal.js"), exports);
14
15
  tslib_1.__exportStar(require("./terms/date-literal.js"), exports);
15
16
  tslib_1.__exportStar(require("./terms/null-literal.js"), exports);
@@ -79,7 +79,7 @@ function $notILike(left, right) {
79
79
  }
80
80
  exports.$notILike = $notILike;
81
81
  function $paren(expression) {
82
- return new index_js_1.ParenthesesExpression(expression);
82
+ return new index_js_1.ParenthesizedExpression(expression);
83
83
  }
84
84
  exports.$paren = $paren;
85
85
  function $arithmetic(n) {
@@ -6,7 +6,6 @@ const antlr4_1 = tslib_1.__importDefault(require("@browsery/antlr4"));
6
6
  const OpraFilterParser_js_1 = require("./antlr/OpraFilterParser.js");
7
7
  const index_js_1 = require("./ast/index.js");
8
8
  const external_constant_js_1 = require("./ast/terms/external-constant.js");
9
- const errors_js_1 = require("./errors.js");
10
9
  const utils_js_1 = require("./utils.js");
11
10
  // Fix: antlr4 d.ts files are invalid
12
11
  const ParseTreeVisitor = antlr4_1.default.tree.ParseTreeVisitor;
@@ -19,7 +18,7 @@ class FilterTreeVisitor extends ParseTreeVisitor {
19
18
  const result = super.visitChildren(node);
20
19
  if (Array.isArray(result) && result.length < 2)
21
20
  return result[0];
22
- return result;
21
+ return result ?? node.getText();
23
22
  }
24
23
  defaultResult() {
25
24
  return undefined;
@@ -27,8 +26,47 @@ class FilterTreeVisitor extends ParseTreeVisitor {
27
26
  visitRoot(ctx) {
28
27
  return this.visit(ctx.expression());
29
28
  }
30
- visitIdentifier(ctx) {
31
- return ctx.getText();
29
+ visitParenthesizedExpression(ctx) {
30
+ const expression = this.visit(ctx.parenthesizedItem());
31
+ return new index_js_1.ParenthesizedExpression(expression);
32
+ }
33
+ visitParenthesizedItem(ctx) {
34
+ return this.visit(ctx.expression());
35
+ }
36
+ visitNegativeExpression(ctx) {
37
+ const expression = this.visit(ctx.expression());
38
+ return new index_js_1.NegativeExpression(expression);
39
+ }
40
+ visitComparisonExpression(ctx) {
41
+ return new index_js_1.ComparisonExpression({
42
+ op: ctx.comparisonOperator().getText(),
43
+ left: this.visit(ctx.comparisonLeft()),
44
+ right: this.visit(ctx.comparisonRight())
45
+ });
46
+ }
47
+ visitLogicalExpression(ctx) {
48
+ const items = [];
49
+ const wrapChildren = (arr, op) => {
50
+ for (const c of arr) {
51
+ if (c instanceof OpraFilterParser_js_1.LogicalExpressionContext && c.logicalOperator().getText() === op) {
52
+ wrapChildren(c.expression_list(), c.logicalOperator().getText());
53
+ continue;
54
+ }
55
+ const o = this.visit(c);
56
+ items.push(o);
57
+ }
58
+ };
59
+ wrapChildren(ctx.expression_list(), ctx.logicalOperator().getText());
60
+ return new index_js_1.LogicalExpression({
61
+ op: ctx.logicalOperator().getText(),
62
+ items
63
+ });
64
+ }
65
+ visitQualifiedIdentifier(ctx) {
66
+ return new index_js_1.QualifiedIdentifier(ctx.getText());
67
+ }
68
+ visitExternalConstant(ctx) {
69
+ return new external_constant_js_1.ExternalConstant(ctx.identifier().getText());
32
70
  }
33
71
  visitNullLiteral() {
34
72
  return new index_js_1.NullLiteral();
@@ -54,68 +92,8 @@ class FilterTreeVisitor extends ParseTreeVisitor {
54
92
  visitTimeLiteral(ctx) {
55
93
  return new index_js_1.TimeLiteral((0, utils_js_1.unquoteFilterString)(ctx.getText()));
56
94
  }
57
- visitQualifiedIdentifierTerm(ctx) {
58
- return new index_js_1.QualifiedIdentifier(ctx.getText());
59
- }
60
- visitPolarityExpression(ctx) {
61
- const x = this.visit(ctx.expression());
62
- if (x.kind === 'NumberLiteral') {
63
- if (ctx.polarOp().getText() === '-')
64
- x.value *= -1;
65
- return x;
66
- }
67
- throw new errors_js_1.SyntaxError('Unexpected token "' + ctx.getText() + '"');
68
- }
69
- visitExternalConstantTerm(ctx) {
70
- return new external_constant_js_1.ExternalConstant(ctx.externalConstant().getText().substring(1));
71
- }
72
- visitParenthesizedExpression(ctx) {
73
- const expression = this.visit(ctx.expression());
74
- return new index_js_1.ParenthesesExpression(expression);
75
- }
76
- visitArrayExpression(ctx) {
77
- return new index_js_1.ArrayExpression(ctx.expression_list().map(child => this.visit(child)));
78
- }
79
- visitComparisonExpression(ctx) {
80
- return new index_js_1.ComparisonExpression({
81
- op: ctx.compOp().getText(),
82
- left: this.visit(ctx.expression(0)),
83
- right: this.visit(ctx.expression(1))
84
- });
85
- }
86
- visitLogicalExpression(ctx) {
87
- const items = [];
88
- const wrapChildren = (arr, op) => {
89
- for (const c of arr) {
90
- if (c instanceof OpraFilterParser_js_1.LogicalExpressionContext && c.logOp().getText() === op) {
91
- wrapChildren(c.expression_list(), c.logOp().getText());
92
- continue;
93
- }
94
- const o = this.visit(c);
95
- items.push(o);
96
- }
97
- };
98
- wrapChildren(ctx.expression_list(), ctx.logOp().getText());
99
- return new index_js_1.LogicalExpression({
100
- op: ctx.logOp().getText(),
101
- items
102
- });
103
- }
104
- visitArithmeticExpression(ctx) {
105
- const exp = new index_js_1.ArithmeticExpression();
106
- const wrapChildren = (children, op) => {
107
- for (let i = 0, len = children.length; i < len; i++) {
108
- const child = children[i];
109
- if (child instanceof OpraFilterParser_js_1.ArithmeticExpressionContext) {
110
- wrapChildren(child.expression_list(), child.arthOp().getText());
111
- continue;
112
- }
113
- const value = this.visit(child);
114
- exp.append(op || '+', value);
115
- }
116
- };
117
- wrapChildren(ctx.expression_list(), ctx.arthOp().getText());
118
- return exp;
95
+ visitArrayValue(ctx) {
96
+ return new index_js_1.ArrayExpression(ctx.value_list().map(child => this.visit(child)));
119
97
  }
120
98
  }
121
99
  exports.FilterTreeVisitor = FilterTreeVisitor;
@@ -1,8 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpraFilter = void 0;
3
4
  const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./ast/index.js"), exports);
5
- tslib_1.__exportStar(require("./parse.js"), exports);
6
- tslib_1.__exportStar(require("./build.js"), exports);
7
- tslib_1.__exportStar(require("./opra-error-listener.js"), exports);
8
- tslib_1.__exportStar(require("./filter-tree-visitor.js"), exports);
5
+ exports.OpraFilter = tslib_1.__importStar(require("./opra-filter.ns.js"));
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./ast/index.js"), exports);
5
+ tslib_1.__exportStar(require("./parse.js"), exports);
6
+ tslib_1.__exportStar(require("./build.js"), exports);
7
+ tslib_1.__exportStar(require("./opra-error-listener.js"), exports);
8
+ tslib_1.__exportStar(require("./filter-tree-visitor.js"), exports);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseFilter = void 0;
3
+ exports.parse = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const antlr4_1 = require("@browsery/antlr4");
6
6
  const OpraFilterLexer_js_1 = tslib_1.__importDefault(require("./antlr/OpraFilterLexer.js"));
@@ -8,7 +8,7 @@ const OpraFilterParser_js_1 = tslib_1.__importDefault(require("./antlr/OpraFilte
8
8
  const errors_js_1 = require("./errors.js");
9
9
  const filter_tree_visitor_js_1 = require("./filter-tree-visitor.js");
10
10
  const opra_error_listener_js_1 = require("./opra-error-listener.js");
11
- function parseFilter(text, visitor) {
11
+ function parse(text, visitor) {
12
12
  const chars = new antlr4_1.CharStream(text);
13
13
  const lexer = new OpraFilterLexer_js_1.default(chars);
14
14
  const tokenStream = new antlr4_1.CommonTokenStream(lexer);
@@ -21,8 +21,6 @@ function parseFilter(text, visitor) {
21
21
  parser.removeErrorListeners();
22
22
  parser.addErrorListener(errorListener);
23
23
  const tree = parser.root();
24
- visitor = visitor || new filter_tree_visitor_js_1.FilterTreeVisitor();
25
- const result = visitor.visit(tree);
26
24
  if (errors.length) {
27
25
  const errMsgs = [];
28
26
  for (const err of errors) {
@@ -35,6 +33,7 @@ function parseFilter(text, visitor) {
35
33
  e.errors = errors;
36
34
  throw e;
37
35
  }
38
- return result;
36
+ visitor = visitor || new filter_tree_visitor_js_1.FilterTreeVisitor();
37
+ return visitor.visit(tree);
39
38
  }
40
- exports.parseFilter = parseFilter;
39
+ exports.parse = parse;
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FilterCodec = void 0;
4
4
  const index_js_1 = require("../../filter/ast/index.js");
5
- const parse_js_1 = require("../../filter/parse.js");
5
+ const index_js_2 = require("../../filter/index.js");
6
6
  class FilterCodec {
7
7
  decode(value) {
8
8
  if (value instanceof index_js_1.Expression)
9
9
  return value;
10
- return (0, parse_js_1.parseFilter)(value);
10
+ return index_js_2.OpraFilter.parse(value);
11
11
  }
12
12
  encode(value) {
13
13
  // @ts-ignore
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HttpMessageHost = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const http_parser_js_1 = require("http-parser-js");
6
5
  const stream_1 = tslib_1.__importDefault(require("stream"));
6
+ const http_parser_1 = require("@browsery/http-parser");
7
7
  const http_headers_js_1 = require("./http-headers.js");
8
8
  const kHeaders = Symbol('kHeaders');
9
9
  const kHeadersProxy = Symbol('kHeadersProxy');
@@ -148,11 +148,11 @@ class HttpMessageHost {
148
148
  this.body = args.body;
149
149
  }
150
150
  _parseBuffer(buf, parserType) {
151
- const parser = new http_parser_js_1.HTTPParser(parserType);
152
- parser[http_parser_js_1.HTTPParser.kOnHeadersComplete] = this[kOnHeaderReceived].bind(this);
153
- parser[http_parser_js_1.HTTPParser.kOnBody] = this[kOnBodyChunk].bind(this);
154
- parser[http_parser_js_1.HTTPParser.kOnHeaders] = this[kOnTrailersReceived].bind(this);
155
- parser[http_parser_js_1.HTTPParser.kOnMessageComplete] = this[kOnReadComplete].bind(this);
151
+ const parser = new http_parser_1.HTTPParser(parserType);
152
+ parser[http_parser_1.HTTPParser.kOnHeadersComplete] = this[kOnHeaderReceived].bind(this);
153
+ parser[http_parser_1.HTTPParser.kOnBody] = this[kOnBodyChunk].bind(this);
154
+ parser[http_parser_1.HTTPParser.kOnHeaders] = this[kOnTrailersReceived].bind(this);
155
+ parser[http_parser_1.HTTPParser.kOnMessageComplete] = this[kOnReadComplete].bind(this);
156
156
  const buffer = Buffer.from(buf);
157
157
  let x = parser.execute(buffer);
158
158
  if (typeof x === 'object')
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HttpRequestMessage = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const accepts_1 = tslib_1.__importDefault(require("accepts"));
6
- const http_parser_js_1 = require("http-parser-js");
7
6
  const type_is_1 = tslib_1.__importDefault(require("type-is"));
7
+ const http_parser_1 = require("@browsery/http-parser");
8
8
  const http_message_host_js_1 = require("./http-message.host.js");
9
9
  const http_params_js_1 = require("./http-params.js");
10
10
  const HTTP_VERSION_PATTERN = /^(\d)\.(\d)$/;
@@ -130,7 +130,7 @@ class HttpRequestMessageHost extends http_message_host_js_1.HttpMessageHost {
130
130
  }
131
131
  [http_message_host_js_1.HttpMessageHost.kOnHeaderReceived](info) {
132
132
  super[http_message_host_js_1.HttpMessageHost.kOnHeaderReceived](info);
133
- this.method = http_parser_js_1.HTTPParser.methods[info.method];
133
+ this.method = http_parser_1.HTTPParser.methods[info.method];
134
134
  this.url = info.url;
135
135
  this.baseUrl = info.url;
136
136
  }
@@ -141,7 +141,7 @@ class HttpRequestMessageHost extends http_message_host_js_1.HttpMessageHost {
141
141
  }
142
142
  static fromBuffer(buffer) {
143
143
  const msg = new HttpRequestMessageHost();
144
- msg._parseBuffer(buffer, http_parser_js_1.HTTPParser.REQUEST);
144
+ msg._parseBuffer(buffer, http_parser_1.HTTPParser.REQUEST);
145
145
  return msg;
146
146
  }
147
147
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -6,9 +6,9 @@ const content_disposition_1 = tslib_1.__importDefault(require("content-dispositi
6
6
  const cookie_1 = tslib_1.__importDefault(require("cookie"));
7
7
  const cookie_signature_1 = tslib_1.__importDefault(require("cookie-signature"));
8
8
  const encodeurl_1 = tslib_1.__importDefault(require("encodeurl"));
9
- const http_parser_js_1 = require("http-parser-js");
10
9
  const mime_types_1 = tslib_1.__importDefault(require("mime-types"));
11
10
  const path_1 = tslib_1.__importDefault(require("path"));
11
+ const http_parser_1 = require("@browsery/http-parser");
12
12
  const http_status_messages_js_1 = require("./enums/http-status-messages.js");
13
13
  const http_message_host_js_1 = require("./http-message.host.js");
14
14
  /**
@@ -227,7 +227,7 @@ class HttpResponseMessageHost extends http_message_host_js_1.HttpMessageHost {
227
227
  }
228
228
  static fromBuffer(buffer) {
229
229
  const msg = new HttpResponseMessageHost();
230
- msg._parseBuffer(buffer, http_parser_js_1.HTTPParser.RESPONSE);
230
+ msg._parseBuffer(buffer, http_parser_1.HTTPParser.RESPONSE);
231
231
  return msg;
232
232
  }
233
233
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- // import Highland from 'highland';
2
+ // import Highland from '@browsery/highland';
3
3
  // import { Readable } from 'stream';
4
4
  // import { uid } from 'uid';
5
5
  // import { isReadable } from '../../helpers/index.js';
package/cjs/i18n/i18n.js CHANGED
@@ -4,8 +4,8 @@ exports.I18n = exports.BaseI18n = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const fast_tokenizer_1 = require("fast-tokenizer");
6
6
  const fs_1 = tslib_1.__importDefault(require("fs"));
7
- const i18next_1 = tslib_1.__importDefault(require("i18next"));
8
7
  const path_1 = tslib_1.__importDefault(require("path"));
8
+ const i18next_1 = tslib_1.__importDefault(require("@browsery/i18next"));
9
9
  const index_js_1 = require("../helpers/index.js");
10
10
  const string_utils_js_1 = require("./string-utils.js");
11
11
  exports.BaseI18n = Object.getPrototypeOf(i18next_1.default).constructor;
@@ -138,7 +138,7 @@ const proto = {
138
138
  if (dataType && !dataType.additionalFields) {
139
139
  if (silent)
140
140
  return { done: true, value: [] };
141
- throw new Error(`Invalid field definition "${curPath}"`);
141
+ throw new Error(`Unknown or Invalid field (${curPath})`);
142
142
  }
143
143
  }
144
144
  }
@@ -1,7 +1,7 @@
1
1
  import omit from 'lodash.omit';
2
2
  import merge from 'putil-merge';
3
3
  import { BadRequestError } from '../../exception/index.js';
4
- import { ArithmeticExpression, ArrayExpression, ComparisonExpression, LogicalExpression, ParenthesesExpression, QualifiedIdentifier } from '../../filter/index.js';
4
+ import { OpraFilter } from '../../filter/index.js';
5
5
  import { omitUndefined } from '../../helpers/index.js';
6
6
  import { translate } from '../../i18n/index.js';
7
7
  import { OpraSchema } from '../../schema/index.js';
@@ -133,23 +133,29 @@ const proto = {
133
133
  });
134
134
  return normalized;
135
135
  },
136
- normalizeFilter(ast) {
137
- if (ast instanceof ComparisonExpression) {
136
+ normalizeFilter(filter) {
137
+ if (!filter)
138
+ return;
139
+ const ast = typeof filter === 'string' ? OpraFilter.parse(filter) : filter;
140
+ if (ast instanceof OpraFilter.ComparisonExpression) {
138
141
  this.normalizeFilter(ast.left);
142
+ if (!(ast.left instanceof OpraFilter.QualifiedIdentifier && ast.left.field))
143
+ throw new TypeError(`Invalid filter query. Left side should be a data field.`);
144
+ this.normalizeFilter(ast.right);
139
145
  }
140
- else if (ast instanceof LogicalExpression) {
146
+ else if (ast instanceof OpraFilter.LogicalExpression) {
141
147
  ast.items.forEach(item => this.normalizeFilter(item));
142
148
  }
143
- else if (ast instanceof ArithmeticExpression) {
149
+ else if (ast instanceof OpraFilter.ArithmeticExpression) {
144
150
  ast.items.forEach(item => this.normalizeFilter(item.expression));
145
151
  }
146
- else if (ast instanceof ArrayExpression) {
152
+ else if (ast instanceof OpraFilter.ArrayExpression) {
147
153
  ast.items.forEach(item => this.normalizeFilter(item));
148
154
  }
149
- else if (ast instanceof ParenthesesExpression) {
155
+ else if (ast instanceof OpraFilter.ParenthesizedExpression) {
150
156
  this.normalizeFilter(ast.expression);
151
157
  }
152
- else if (ast instanceof QualifiedIdentifier) {
158
+ else if (ast instanceof OpraFilter.QualifiedIdentifier) {
153
159
  ast.field = this.type.findField(ast.value);
154
160
  ast.dataType = ast.field?.type || this.document.getDataType('any');
155
161
  ast.value = this.type.normalizeFieldPath(ast.value);