@shko.online/dataverse-odata 0.2.0 → 0.2.1

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,3 @@
1
+ {
2
+ "js/ts.tsdk.path": "node_modules\\typescript\\lib"
3
+ }
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.2.1](https://github.com/Shko-Online/dataverse-odata/compare/v0.2.0...v0.2.1) (2026-05-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Fixed exports for index ([d623a40](https://github.com/Shko-Online/dataverse-odata/commit/d623a40515dec7888997634cbf5d043ebbf91461))
7
+
1
8
  # [0.2.0](https://github.com/Shko-Online/dataverse-odata/compare/v0.1.6...v0.2.0) (2026-04-11)
2
9
 
3
10
 
@@ -2,9 +2,9 @@ pool:
2
2
  vmImage: ubuntu-latest
3
3
 
4
4
  steps:
5
- - task: NodeTool@1
5
+ - task: UseNode@1
6
6
  inputs:
7
- versionSpec: '24.x'
7
+ version: '24.x'
8
8
  displayName: 'Install Node.js'
9
9
 
10
10
  - task: Npm@1
@@ -31,7 +31,7 @@ const getFetchXmlFromParser = (parser, result) => {
31
31
  return false;
32
32
  }
33
33
  const entity = fetchXmlDocument.evaluate('fetch/entity', fetchXmlDocument, null, XPathResult.ANY_TYPE, null).iterateNext();
34
- if (fetchXmlDocument.documentElement.children.length != 1 || !entity || !entity.getAttribute('name')) {
34
+ if (fetchXmlDocument.documentElement.children.length != 1 || !entity?.getAttribute('name')) {
35
35
  result.error = {
36
36
  code: '0x80041102',
37
37
  message: 'Entity Name was not specified in FetchXml String.'
@@ -67,7 +67,7 @@ function tokenize(input) {
67
67
  value: input.slice(i, i + 36)
68
68
  });
69
69
  i += 36;
70
- } else if (/[0-9]/.test(input[i]) || input[i] === '-' && /[0-9]/.test(input[i + 1] ?? '')) {
70
+ } else if (/\d/.test(input[i]) || input[i] === '-' && /\d/.test(input[i + 1] ?? '')) {
71
71
  let j = i;
72
72
  if (input[j] === '-') j++;
73
73
  while (j < input.length && /[0-9.]/.test(input[j])) j++;
@@ -78,7 +78,7 @@ function tokenize(input) {
78
78
  i = j;
79
79
  } else if (/[a-zA-Z_]/.test(input[i])) {
80
80
  let j = i;
81
- while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++;
81
+ while (j < input.length && /\w/.test(input[j])) j++;
82
82
  tokens.push({
83
83
  type: 'word',
84
84
  value: input.slice(i, j)
@@ -101,13 +101,15 @@ class FilterParser {
101
101
  }
102
102
  consume(expected) {
103
103
  const token = this.tokens[this.pos++];
104
- if (!token) throw new Error(`Unexpected end of filter expression${expected ? `, expected ${expected}` : ''}`);
104
+ const expectedString = expected ? `, expected ${expected}` : '';
105
+ if (!token) throw new Error(`Unexpected end of filter expression${expectedString}`);
105
106
  return token;
106
107
  }
107
108
  expect(type, value) {
108
- const token = this.consume(`${type}${value ? ` '${value}'` : ''}`);
109
+ const valueString = value ? ` '${value}'` : '';
110
+ const token = this.consume(`${type}${valueString}`);
109
111
  if (token.type !== type || value !== undefined && token.value !== value) {
110
- throw new Error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${token.type} '${token.value}'`);
112
+ throw new Error(`Expected ${type}${valueString} but got ${token.type} '${token.value}'`);
111
113
  }
112
114
  return token;
113
115
  }
package/lib/cjs/index.js CHANGED
@@ -3,7 +3,18 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _parseOData.parseOData;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "getAliasedProperty", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _getAliasedProperty.getAliasedProperty;
16
+ }
17
+ });
7
18
  Object.defineProperty(exports, "getExpandFromParser", {
8
19
  enumerable: true,
9
20
  get: function () {
@@ -16,6 +27,12 @@ Object.defineProperty(exports, "getFetchXmlFromParser", {
16
27
  return _getFetchXmlFromParser.getFetchXmlFromParser;
17
28
  }
18
29
  });
30
+ Object.defineProperty(exports, "getFilterFromParser", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _getFilterFromParser.getFilterFromParser;
34
+ }
35
+ });
19
36
  Object.defineProperty(exports, "getOrderByFromParser", {
20
37
  enumerable: true,
21
38
  get: function () {
@@ -46,11 +63,12 @@ Object.defineProperty(exports, "parseOData", {
46
63
  return _parseOData.parseOData;
47
64
  }
48
65
  });
66
+ var _getAliasedProperty = require("./getAliasedProperty");
49
67
  var _getExpandFromParser = require("./getExpandFromParser");
50
68
  var _getFetchXmlFromParser = require("./getFetchXmlFromParser");
69
+ var _getFilterFromParser = require("./getFilterFromParser");
51
70
  var _getOrderByFromParser = require("./getOrderByFromParser");
52
71
  var _getSelectFromParser = require("./getSelectFromParser");
53
72
  var _getTopFromParser = require("./getTopFromParser");
54
73
  var _getXQueryFromParser = require("./getXQueryFromParser");
55
- var _parseOData = require("./parseOData");
56
- var _default = exports.default = _parseOData.parseOData;
74
+ var _parseOData = require("./parseOData");
@@ -25,7 +25,7 @@ export const getFetchXmlFromParser = (parser, result) => {
25
25
  return false;
26
26
  }
27
27
  const entity = fetchXmlDocument.evaluate('fetch/entity', fetchXmlDocument, null, XPathResult.ANY_TYPE, null).iterateNext();
28
- if (fetchXmlDocument.documentElement.children.length != 1 || !entity || !entity.getAttribute('name')) {
28
+ if (fetchXmlDocument.documentElement.children.length != 1 || !entity?.getAttribute('name')) {
29
29
  result.error = {
30
30
  code: '0x80041102',
31
31
  message: 'Entity Name was not specified in FetchXml String.'
@@ -61,7 +61,7 @@ function tokenize(input) {
61
61
  value: input.slice(i, i + 36)
62
62
  });
63
63
  i += 36;
64
- } else if (/[0-9]/.test(input[i]) || input[i] === '-' && /[0-9]/.test(input[i + 1] ?? '')) {
64
+ } else if (/\d/.test(input[i]) || input[i] === '-' && /\d/.test(input[i + 1] ?? '')) {
65
65
  let j = i;
66
66
  if (input[j] === '-') j++;
67
67
  while (j < input.length && /[0-9.]/.test(input[j])) j++;
@@ -72,7 +72,7 @@ function tokenize(input) {
72
72
  i = j;
73
73
  } else if (/[a-zA-Z_]/.test(input[i])) {
74
74
  let j = i;
75
- while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++;
75
+ while (j < input.length && /\w/.test(input[j])) j++;
76
76
  tokens.push({
77
77
  type: 'word',
78
78
  value: input.slice(i, j)
@@ -95,13 +95,15 @@ class FilterParser {
95
95
  }
96
96
  consume(expected) {
97
97
  const token = this.tokens[this.pos++];
98
- if (!token) throw new Error(`Unexpected end of filter expression${expected ? `, expected ${expected}` : ''}`);
98
+ const expectedString = expected ? `, expected ${expected}` : '';
99
+ if (!token) throw new Error(`Unexpected end of filter expression${expectedString}`);
99
100
  return token;
100
101
  }
101
102
  expect(type, value) {
102
- const token = this.consume(`${type}${value ? ` '${value}'` : ''}`);
103
+ const valueString = value ? ` '${value}'` : '';
104
+ const token = this.consume(`${type}${valueString}`);
103
105
  if (token.type !== type || value !== undefined && token.value !== value) {
104
- throw new Error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${token.type} '${token.value}'`);
106
+ throw new Error(`Expected ${type}${valueString} but got ${token.type} '${token.value}'`);
105
107
  }
106
108
  return token;
107
109
  }
package/lib/esm/index.js CHANGED
@@ -1,9 +1,9 @@
1
+ export { getAliasedProperty } from './getAliasedProperty';
1
2
  export { getExpandFromParser } from './getExpandFromParser';
2
3
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
4
+ export { getFilterFromParser } from './getFilterFromParser';
3
5
  export { getOrderByFromParser } from './getOrderByFromParser';
4
6
  export { getSelectFromParser } from './getSelectFromParser';
5
7
  export { getTopFromParser } from './getTopFromParser';
6
8
  export { getXQueryFromParser } from './getXQueryFromParser';
7
- export { parseOData } from './parseOData';
8
- import { parseOData } from './parseOData';
9
- export default parseOData;
9
+ export { parseOData, parseOData as default } from './parseOData';
@@ -25,7 +25,7 @@ export const getFetchXmlFromParser = (parser, result) => {
25
25
  return false;
26
26
  }
27
27
  const entity = fetchXmlDocument.evaluate('fetch/entity', fetchXmlDocument, null, XPathResult.ANY_TYPE, null).iterateNext();
28
- if (fetchXmlDocument.documentElement.children.length != 1 || !entity || !entity.getAttribute('name')) {
28
+ if (fetchXmlDocument.documentElement.children.length != 1 || !(entity !== null && entity !== void 0 && entity.getAttribute('name'))) {
29
29
  result.error = {
30
30
  code: '0x80041102',
31
31
  message: 'Entity Name was not specified in FetchXml String.'
@@ -62,7 +62,7 @@ function tokenize(input) {
62
62
  value: input.slice(i, i + 36)
63
63
  });
64
64
  i += 36;
65
- } else if (/[0-9]/.test(input[i]) || input[i] === '-' && /[0-9]/.test((_input = input[i + 1]) !== null && _input !== void 0 ? _input : '')) {
65
+ } else if (/\d/.test(input[i]) || input[i] === '-' && /\d/.test((_input = input[i + 1]) !== null && _input !== void 0 ? _input : '')) {
66
66
  let j = i;
67
67
  if (input[j] === '-') j++;
68
68
  while (j < input.length && /[0-9.]/.test(input[j])) j++;
@@ -73,7 +73,7 @@ function tokenize(input) {
73
73
  i = j;
74
74
  } else if (/[a-zA-Z_]/.test(input[i])) {
75
75
  let j = i;
76
- while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++;
76
+ while (j < input.length && /\w/.test(input[j])) j++;
77
77
  tokens.push({
78
78
  type: 'word',
79
79
  value: input.slice(i, j)
@@ -97,13 +97,15 @@ class FilterParser {
97
97
  }
98
98
  consume(expected) {
99
99
  const token = this.tokens[this.pos++];
100
- if (!token) throw new Error(`Unexpected end of filter expression${expected ? `, expected ${expected}` : ''}`);
100
+ const expectedString = expected ? `, expected ${expected}` : '';
101
+ if (!token) throw new Error(`Unexpected end of filter expression${expectedString}`);
101
102
  return token;
102
103
  }
103
104
  expect(type, value) {
104
- const token = this.consume(`${type}${value ? ` '${value}'` : ''}`);
105
+ const valueString = value ? ` '${value}'` : '';
106
+ const token = this.consume(`${type}${valueString}`);
105
107
  if (token.type !== type || value !== undefined && token.value !== value) {
106
- throw new Error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${token.type} '${token.value}'`);
108
+ throw new Error(`Expected ${type}${valueString} but got ${token.type} '${token.value}'`);
107
109
  }
108
110
  return token;
109
111
  }
@@ -1,9 +1,9 @@
1
+ export { getAliasedProperty } from './getAliasedProperty';
1
2
  export { getExpandFromParser } from './getExpandFromParser';
2
3
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
4
+ export { getFilterFromParser } from './getFilterFromParser';
3
5
  export { getOrderByFromParser } from './getOrderByFromParser';
4
6
  export { getSelectFromParser } from './getSelectFromParser';
5
7
  export { getTopFromParser } from './getTopFromParser';
6
8
  export { getXQueryFromParser } from './getXQueryFromParser';
7
- export { parseOData } from './parseOData';
8
- import { parseOData } from './parseOData';
9
- export default parseOData;
9
+ export { parseOData, parseOData as default } from './parseOData';
@@ -1,11 +1,11 @@
1
- export { BinaryOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataQuery, ODataSelect, ODataTop, StandardOperator, StandardOperators, } from './OData.types';
1
+ export { BinaryOperator, ColumnOperator, FilterOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataOrderBy, ODataQuery, ODataSavedQuery, ODataSelect, ODataTop, ODataUserQuery, QueryFunctionOperator, QueryFunctionOperators, StandardOperator, StandardOperators, UnaryOperator, } from './OData.types';
2
+ export { getAliasedProperty } from './getAliasedProperty';
2
3
  export { getExpandFromParser } from './getExpandFromParser';
3
4
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
5
+ export { getFilterFromParser } from './getFilterFromParser';
4
6
  export { getOrderByFromParser } from './getOrderByFromParser';
5
7
  export { getSelectFromParser } from './getSelectFromParser';
6
8
  export { getTopFromParser } from './getTopFromParser';
7
9
  export { getXQueryFromParser } from './getXQueryFromParser';
8
- export { parseOData } from './parseOData';
9
- import { parseOData } from './parseOData';
10
- export default parseOData;
10
+ export { parseOData, parseOData as default } from './parseOData';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1,11 +1,11 @@
1
- export type { BinaryOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataQuery, ODataSelect, ODataTop, StandardOperator, StandardOperators, } from './OData.types';
1
+ export type { BinaryOperator, ColumnOperator, FilterOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataOrderBy, ODataQuery, ODataSavedQuery, ODataSelect, ODataTop, ODataUserQuery, QueryFunctionOperator, QueryFunctionOperators, StandardOperator, StandardOperators, UnaryOperator, } from './OData.types';
2
+ export { getAliasedProperty } from './getAliasedProperty';
2
3
  export { getExpandFromParser } from './getExpandFromParser';
3
4
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
5
+ export { getFilterFromParser } from './getFilterFromParser';
4
6
  export { getOrderByFromParser } from './getOrderByFromParser';
5
7
  export { getSelectFromParser } from './getSelectFromParser';
6
8
  export { getTopFromParser } from './getTopFromParser';
7
9
  export { getXQueryFromParser } from './getXQueryFromParser';
8
- export { parseOData } from './parseOData';
9
- import { parseOData } from './parseOData';
10
- export default parseOData;
10
+ export { parseOData, parseOData as default } from './parseOData';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFilterFromParser.d.ts","sourceRoot":"","sources":["../../src/getFilterFromParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAuMhE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,eAAe,EAAE,QAAQ,UAAU,KAAG,OAoBjF,CAAC"}
1
+ {"version":3,"file":"getFilterFromParser.d.ts","sourceRoot":"","sources":["../../src/getFilterFromParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAyMhE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,eAAe,EAAE,QAAQ,UAAU,KAAG,OAoBjF,CAAC"}
@@ -1,11 +1,11 @@
1
- export type { BinaryOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataQuery, ODataSelect, ODataTop, StandardOperator, StandardOperators, } from './OData.types';
1
+ export type { BinaryOperator, ColumnOperator, FilterOperator, ODataError, ODataExpand, ODataExpandQuery, ODataFetch, ODataFilter, ODataOrderBy, ODataQuery, ODataSavedQuery, ODataSelect, ODataTop, ODataUserQuery, QueryFunctionOperator, QueryFunctionOperators, StandardOperator, StandardOperators, UnaryOperator, } from './OData.types';
2
+ export { getAliasedProperty } from './getAliasedProperty';
2
3
  export { getExpandFromParser } from './getExpandFromParser';
3
4
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
5
+ export { getFilterFromParser } from './getFilterFromParser';
4
6
  export { getOrderByFromParser } from './getOrderByFromParser';
5
7
  export { getSelectFromParser } from './getSelectFromParser';
6
8
  export { getTopFromParser } from './getTopFromParser';
7
9
  export { getXQueryFromParser } from './getXQueryFromParser';
8
- export { parseOData } from './parseOData';
9
- import { parseOData } from './parseOData';
10
- export default parseOData;
10
+ export { parseOData, parseOData as default } from './parseOData';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,cAAc,EACd,cAAc,EACd,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shko.online/dataverse-odata",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "This package will help parse OData strings (only the Microsoft Dataverse subset). It can be used as a validator, or you can build some javascript library which consumes the output of this library.",
5
5
  "scripts": {
6
6
  "build": "npm run lint && build-npm-package",
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "homepage": "https://github.com/shko-online/dataverse-odata#readme",
45
45
  "devDependencies": {
46
- "@babel/cli": "^7.20.7",
47
- "@babel/core": "^7.20.12",
46
+ "@babel/cli": "^7.28.6",
47
+ "@babel/core": "^7.29.0",
48
48
  "@babel/plugin-proposal-class-properties": "^7.18.6",
49
49
  "@babel/plugin-proposal-decorators": "^7.20.13",
50
50
  "@babel/plugin-proposal-export-default-from": "^7.18.10",
@@ -53,11 +53,11 @@
53
53
  "@babel/plugin-proposal-private-property-in-object": "^7.20.5",
54
54
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
55
55
  "@babel/plugin-transform-runtime": "^7.19.6",
56
- "@babel/preset-env": "^7.20.2",
57
- "@babel/preset-flow": "^7.18.6",
58
- "@babel/preset-react": "^7.18.6",
59
- "@babel/preset-typescript": "^7.18.6",
60
- "@emotion/babel-plugin": "^11.10.5",
56
+ "@babel/preset-env": "^7.29.2",
57
+ "@babel/preset-flow": "^7.27.1",
58
+ "@babel/preset-react": "^7.28.5",
59
+ "@babel/preset-typescript": "^7.28.5",
60
+ "@emotion/babel-plugin": "^11.13.5",
61
61
  "@jest/globals": "^29.4.2",
62
62
  "@semantic-release/changelog": "^6.0.3",
63
63
  "@semantic-release/commit-analyzer": "^13.0.1",
@@ -30,7 +30,7 @@ export const getFetchXmlFromParser = (parser: URLSearchParams, result: ODataQuer
30
30
  const entity = fetchXmlDocument
31
31
  .evaluate('fetch/entity', fetchXmlDocument, null, XPathResult.ANY_TYPE, null)
32
32
  .iterateNext() as Element;
33
- if (fetchXmlDocument.documentElement.children.length != 1 || !entity || !entity.getAttribute('name')) {
33
+ if (fetchXmlDocument.documentElement.children.length != 1 || !entity?.getAttribute('name')) {
34
34
  result.error = {
35
35
  code: '0x80041102',
36
36
  message: 'Entity Name was not specified in FetchXml String.',
@@ -63,7 +63,7 @@ function tokenize(input: string): Token[] {
63
63
  } else if (/[0-9a-fA-F]/.test(input[i]) && GUID_REGEX.test(input.slice(i))) {
64
64
  tokens.push({ type: 'string', value: input.slice(i, i + 36) });
65
65
  i += 36;
66
- } else if (/[0-9]/.test(input[i]) || (input[i] === '-' && /[0-9]/.test(input[i + 1] ?? ''))) {
66
+ } else if (/\d/.test(input[i]) || (input[i] === '-' && /\d/.test(input[i + 1] ?? ''))) {
67
67
  let j = i;
68
68
  if (input[j] === '-') j++;
69
69
  while (j < input.length && /[0-9.]/.test(input[j])) j++;
@@ -71,7 +71,7 @@ function tokenize(input: string): Token[] {
71
71
  i = j;
72
72
  } else if (/[a-zA-Z_]/.test(input[i])) {
73
73
  let j = i;
74
- while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++;
74
+ while (j < input.length && /\w/.test(input[j])) j++;
75
75
  tokens.push({ type: 'word', value: input.slice(i, j) });
76
76
  i = j;
77
77
  } else {
@@ -82,7 +82,7 @@ function tokenize(input: string): Token[] {
82
82
  }
83
83
 
84
84
  class FilterParser {
85
- private tokens: Token[];
85
+ private readonly tokens: Token[];
86
86
  private pos = 0;
87
87
 
88
88
  constructor(tokens: Token[]) {
@@ -95,15 +95,17 @@ class FilterParser {
95
95
 
96
96
  private consume(expected?: string): Token {
97
97
  const token = this.tokens[this.pos++];
98
- if (!token) throw new Error(`Unexpected end of filter expression${expected ? `, expected ${expected}` : ''}`);
98
+ const expectedString = expected ? `, expected ${expected}` : '';
99
+ if (!token) throw new Error(`Unexpected end of filter expression${expectedString}`);
99
100
  return token;
100
101
  }
101
102
 
102
103
  private expect(type: TokenType, value?: string): Token {
103
- const token = this.consume(`${type}${value ? ` '${value}'` : ''}`);
104
+ const valueString = value ? ` '${value}'` : '';
105
+ const token = this.consume(`${type}${valueString}`);
104
106
  if (token.type !== type || (value !== undefined && token.value !== value)) {
105
107
  throw new Error(
106
- `Expected ${type}${value ? ` '${value}'` : ''} but got ${token.type} '${token.value}'`,
108
+ `Expected ${type}${valueString} but got ${token.type} '${token.value}'`,
107
109
  );
108
110
  }
109
111
  return token;
package/src/index.ts CHANGED
@@ -1,24 +1,32 @@
1
1
  export type {
2
2
  BinaryOperator,
3
+ ColumnOperator,
4
+ FilterOperator,
3
5
  ODataError,
4
6
  ODataExpand,
5
7
  ODataExpandQuery,
6
8
  ODataFetch,
7
9
  ODataFilter,
10
+ ODataOrderBy,
8
11
  ODataQuery,
12
+ ODataSavedQuery,
9
13
  ODataSelect,
10
14
  ODataTop,
15
+ ODataUserQuery,
16
+ QueryFunctionOperator,
17
+ QueryFunctionOperators,
11
18
  StandardOperator,
12
19
  StandardOperators,
20
+ UnaryOperator,
13
21
  } from './OData.types';
14
22
 
23
+ export { getAliasedProperty } from './getAliasedProperty';
15
24
  export { getExpandFromParser } from './getExpandFromParser';
16
25
  export { getFetchXmlFromParser } from './getFetchXmlFromParser';
26
+ export { getFilterFromParser } from './getFilterFromParser';
17
27
  export { getOrderByFromParser } from './getOrderByFromParser';
18
28
  export { getSelectFromParser } from './getSelectFromParser';
19
29
  export { getTopFromParser } from './getTopFromParser';
20
30
  export { getXQueryFromParser } from './getXQueryFromParser';
21
31
 
22
- export { parseOData } from './parseOData';
23
- import { parseOData } from './parseOData';
24
- export default parseOData;
32
+ export { parseOData, parseOData as default } from './parseOData';