night-query-parser 0.0.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.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # night-query-parser
@@ -0,0 +1,4 @@
1
+ import { SyntaxToken } from './tokenizer';
2
+ import { FieldSelectorNode } from './types';
3
+ export { parseFieldSelector };
4
+ declare function parseFieldSelector(tokens: SyntaxToken[]): FieldSelectorNode;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFieldSelector = parseFieldSelector;
4
+ const error_1 = require("../error");
5
+ const tokenizer_1 = require("./tokenizer");
6
+ const types_1 = require("./types");
7
+ // Parse field selector from a collection of tokens.
8
+ // Field selector token pattern is (Reference) + (Operator) + (Value)
9
+ function parseFieldSelector(tokens) {
10
+ const operatorStartIdx = tokens.findIndex((t) => tokenIsFieldOperator(t));
11
+ if (operatorStartIdx == -1) {
12
+ throw new Error('Unable to parse field selector, expected field operator');
13
+ }
14
+ // Parse field selector reference
15
+ const fieldReferenceTokens = tokens.splice(0, operatorStartIdx);
16
+ const fieldSelectorReference = parseFieldSelectorReference(fieldReferenceTokens);
17
+ // Parse field selector operator
18
+ const fieldOperatorTokens = [];
19
+ while (true) {
20
+ const fieldOperator = tokens.shift();
21
+ if (!fieldOperator) {
22
+ throw new error_1.InvalidOrUnexpectedTokens('Unable to parse field selector, invalid operator', tokens);
23
+ }
24
+ if (!tokenIsFieldOperator(fieldOperator)) {
25
+ tokens.unshift(fieldOperator);
26
+ break;
27
+ }
28
+ fieldOperatorTokens.push(fieldOperator);
29
+ }
30
+ const fieldSelectorOperator = parseFieldSelectorOperator(fieldOperatorTokens);
31
+ // Parse field selector value
32
+ const fieldSelectorValue = parseFieldSelectorValue(tokens);
33
+ return {
34
+ type: 'FieldSelector',
35
+ reference: fieldSelectorReference,
36
+ operator: fieldSelectorOperator,
37
+ value: fieldSelectorValue,
38
+ };
39
+ }
40
+ function tokenIsFieldOperator(token) {
41
+ return [
42
+ tokenizer_1.SyntaxTokenTypes.Equal,
43
+ tokenizer_1.SyntaxTokenTypes.Not,
44
+ tokenizer_1.SyntaxTokenTypes.GreaterThan,
45
+ tokenizer_1.SyntaxTokenTypes.LessThan,
46
+ tokenizer_1.SyntaxTokenTypes.ILike,
47
+ tokenizer_1.SyntaxTokenTypes.Regex,
48
+ ].includes(token.type);
49
+ }
50
+ function parseFieldSelectorReference(tokens) {
51
+ // Single reference
52
+ if (tokens.length == 1 && tokens[0].type == tokenizer_1.SyntaxTokenTypes.Reference) {
53
+ return { type: 'FieldReference', paths: tokens };
54
+ }
55
+ // Joined references
56
+ const joinedReferencesTokenTypes = [
57
+ tokenizer_1.SyntaxTokenTypes.Reference,
58
+ tokenizer_1.SyntaxTokenTypes.ReferenceJoin,
59
+ ];
60
+ if (tokens.length > 1 &&
61
+ tokens.every((t) => joinedReferencesTokenTypes.includes(t.type))) {
62
+ // Ensure references are joined properly
63
+ const joinsIdx = tokens.map((_, idx) => idx);
64
+ if (joinsIdx.every((idx) => idx % 2 == 1)) {
65
+ throw new error_1.InvalidOrUnexpectedTokens('Invalid field reference, invalid reference joins', tokens);
66
+ }
67
+ const references = tokens.filter((t) => t.type == tokenizer_1.SyntaxTokenTypes.Reference);
68
+ return { type: 'FieldReference', paths: references };
69
+ }
70
+ throw new error_1.InvalidOrUnexpectedTokens('Unexpected tokens while parsing field selector reference', tokens);
71
+ }
72
+ function parseFieldSelectorOperator(tokens) {
73
+ if (tokens.length === 1) {
74
+ const operator = tokens[0];
75
+ switch (operator.type) {
76
+ case tokenizer_1.SyntaxTokenTypes.GreaterThan:
77
+ return types_1.FieldOperatorNode.GreaterThan;
78
+ case tokenizer_1.SyntaxTokenTypes.LessThan:
79
+ return types_1.FieldOperatorNode.LessThan;
80
+ case tokenizer_1.SyntaxTokenTypes.Equal:
81
+ return types_1.FieldOperatorNode.Equal;
82
+ case tokenizer_1.SyntaxTokenTypes.Not:
83
+ return types_1.FieldOperatorNode.NotEqual;
84
+ case tokenizer_1.SyntaxTokenTypes.ILike:
85
+ return types_1.FieldOperatorNode.ILike;
86
+ case tokenizer_1.SyntaxTokenTypes.Regex:
87
+ return types_1.FieldOperatorNode.Regex;
88
+ }
89
+ }
90
+ if (tokens.length === 2) {
91
+ const hasGreaterThan = tokens.some((o) => o.type === tokenizer_1.SyntaxTokenTypes.GreaterThan);
92
+ const hasLessThan = tokens.some((o) => o.type === tokenizer_1.SyntaxTokenTypes.LessThan);
93
+ const hasEqual = tokens.some((o) => o.type === tokenizer_1.SyntaxTokenTypes.Equal);
94
+ const hasNotEqual = tokens.some((o) => o.type === tokenizer_1.SyntaxTokenTypes.Not);
95
+ const hasRegex = tokens.some((o) => o.type === tokenizer_1.SyntaxTokenTypes.Regex);
96
+ if (hasGreaterThan && hasEqual)
97
+ return types_1.FieldOperatorNode.GreaterThanOrEqual;
98
+ if (hasLessThan && hasEqual)
99
+ return types_1.FieldOperatorNode.LessThanOrEqual;
100
+ if (hasRegex && hasEqual)
101
+ return types_1.FieldOperatorNode.Regex;
102
+ if (hasNotEqual && hasEqual)
103
+ return types_1.FieldOperatorNode.NotEqual;
104
+ if (hasEqual &&
105
+ !hasGreaterThan &&
106
+ !hasLessThan &&
107
+ !hasRegex &&
108
+ !hasNotEqual) {
109
+ return types_1.FieldOperatorNode.Equal;
110
+ }
111
+ }
112
+ throw new error_1.InvalidOrUnexpectedTokens('Unexpected token pattern while parsing field selector operator', tokens);
113
+ }
114
+ function parseFieldSelectorValue(tokens) {
115
+ // Single literal value or reference
116
+ if (tokens.length == 1) {
117
+ const token = tokens[0];
118
+ if ([
119
+ tokenizer_1.SyntaxTokenTypes.QuotedText,
120
+ tokenizer_1.SyntaxTokenTypes.Number,
121
+ tokenizer_1.SyntaxTokenTypes.True,
122
+ tokenizer_1.SyntaxTokenTypes.False,
123
+ ].includes(token.type)) {
124
+ return { type: 'FieldSelectorValueLiteral', token };
125
+ }
126
+ else if (token.type == tokenizer_1.SyntaxTokenTypes.Reference) {
127
+ return { type: 'FieldReference', paths: [token] };
128
+ }
129
+ }
130
+ // Joined references
131
+ const joinedReferencesTokenTypes = [
132
+ tokenizer_1.SyntaxTokenTypes.Reference,
133
+ tokenizer_1.SyntaxTokenTypes.ReferenceJoin,
134
+ ];
135
+ if (tokens.length > 1 &&
136
+ tokens.every((t) => joinedReferencesTokenTypes.includes(t.type))) {
137
+ // Ensure references are joined properly
138
+ const joinsIdx = tokens.map((_, idx) => idx);
139
+ if (joinsIdx.every((idx) => idx % 2 == 1)) {
140
+ throw new Error('Invalid field reference, invalid reference joins');
141
+ }
142
+ const references = tokens.filter((t) => t.type == tokenizer_1.SyntaxTokenTypes.Reference);
143
+ return { type: 'FieldReference', paths: references };
144
+ }
145
+ // Subgroups
146
+ if ([
147
+ tokenizer_1.SyntaxTokenTypes.OpenArrayGroup,
148
+ tokenizer_1.SyntaxTokenTypes.OpenSubQuery,
149
+ ].includes(tokens[0].type)) {
150
+ // todo
151
+ throw new Error('Not implemented');
152
+ }
153
+ throw new error_1.InvalidOrUnexpectedTokens('Unexpected tokens while parsing field selector value', tokens);
154
+ }
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L2ZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVVMsZ0RBQWtCO0FBVjNCLG9DQUFxRDtBQUVyRCwyQ0FBNEQ7QUFDNUQsbUNBS2lCO0FBSWpCLG9EQUFvRDtBQUNwRCxxRUFBcUU7QUFDckUsU0FBUyxrQkFBa0IsQ0FBQyxNQUFxQjtJQUM3QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ1gseURBQXlELENBQzVELENBQUM7SUFDTixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNLHNCQUFzQixHQUN4QiwyQkFBMkIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXRELGdDQUFnQztJQUNoQyxNQUFNLG1CQUFtQixHQUFrQixFQUFFLENBQUM7SUFDOUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLGlDQUF5QixDQUMvQixrREFBa0QsRUFDbEQsTUFBTSxDQUNULENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5QixNQUFNO1FBQ1YsQ0FBQztRQUVELG1CQUFtQixDQUFDLElBQUksQ0FBQyxh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
@@ -0,0 +1,4 @@
1
+ import { SyntaxToken } from './tokenizer';
2
+ import { FieldGroupNode } from './types';
3
+ export { parseFieldGroup };
4
+ declare function parseFieldGroup(tokens: SyntaxToken[]): FieldGroupNode;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFieldGroup = parseFieldGroup;
4
+ const error_1 = require("../error");
5
+ const field_1 = require("./field");
6
+ const tokenizer_1 = require("./tokenizer");
7
+ const types_1 = require("./types");
8
+ function parseFieldGroup(tokens) {
9
+ // If tokens start and end with group token,
10
+ // remove the group tokens
11
+ const firstOpenGroupToken = tokens.findIndex((t) => t.type == tokenizer_1.SyntaxTokenTypes.OpenGroup);
12
+ const lastOpenGroupToken = tokens.findIndex((t) => t.type == tokenizer_1.SyntaxTokenTypes.CloseGroup);
13
+ if (firstOpenGroupToken == 0 && lastOpenGroupToken == tokens.length - 1) {
14
+ tokens.shift();
15
+ tokens.pop();
16
+ }
17
+ // Extract position of all operators in base depth
18
+ const operators = new Map();
19
+ for (let i = 0; i < tokens.length; i++) {
20
+ const token = tokens[i];
21
+ if (tokenIsPrimaryGroupOperator(token)) {
22
+ const groupOperator = parsePrimaryGroupOperator(token);
23
+ operators.set(groupOperator, [
24
+ ...(operators.get(groupOperator) ?? []),
25
+ i,
26
+ ]);
27
+ // If next token is a open group token,
28
+ // skip tokens until matching close group token
29
+ const startingGroupToken = tokens[i + 1];
30
+ if (startingGroupToken?.type == tokenizer_1.SyntaxTokenTypes.OpenGroup) {
31
+ const groupTokenEndIdx = (0, tokenizer_1.findClosingGroupTokenIdx)(tokens, i + 2, startingGroupToken.type);
32
+ i = groupTokenEndIdx;
33
+ }
34
+ }
35
+ }
36
+ // If there are no operators,
37
+ // parse tokens as a single field selector with AND operator.
38
+ // This should only every run at base depth.
39
+ if (operators.size == 0) {
40
+ const fieldSelector = (0, field_1.parseFieldSelector)(tokens);
41
+ return {
42
+ type: 'FieldGroup',
43
+ operator: types_1.FieldGroupOperatorNode.And,
44
+ children: [fieldSelector],
45
+ };
46
+ }
47
+ // Decide what operate for current group based on precedence rules
48
+ const operatorOrder = [
49
+ types_1.FieldGroupOperatorNode.Or,
50
+ types_1.FieldGroupOperatorNode.And,
51
+ ];
52
+ let groupOperator;
53
+ for (const op of operatorOrder) {
54
+ if (operators.has(op)) {
55
+ groupOperator = op;
56
+ break;
57
+ }
58
+ }
59
+ const fieldGroup = {
60
+ type: 'FieldGroup',
61
+ operator: groupOperator,
62
+ children: [],
63
+ };
64
+ // Split tokens between operator
65
+ const operatorTokenPositions = operators.get(fieldGroup.operator);
66
+ const splitOperatorTokens = operatorTokenPositions.flatMap((position, idx) => {
67
+ const split = [];
68
+ if (idx == 0) {
69
+ split.push(tokens.slice(0, position));
70
+ }
71
+ if (idx == operatorTokenPositions.length - 1) {
72
+ split.push(tokens.slice(position + 1));
73
+ }
74
+ if (idx != 0 && idx != operatorTokenPositions.length - 1) {
75
+ split.push(tokens.slice(operatorTokenPositions[idx - 1] + 1, position));
76
+ }
77
+ return split;
78
+ });
79
+ const emptyOperatorTokensIdx = splitOperatorTokens.findIndex((t) => t.length == 0);
80
+ if (emptyOperatorTokensIdx != -1) {
81
+ const operatorToken = tokens[operatorTokenPositions[emptyOperatorTokensIdx]];
82
+ throw new error_1.InvalidOrUnexpectedTokens('Group operator must be followed by a valid expression', [operatorToken]);
83
+ }
84
+ for (const tokens of splitOperatorTokens) {
85
+ // If tokens start and end with group token,
86
+ // remove the group tokens
87
+ const firstOpenGroupToken = tokens.findIndex((t) => t.type == tokenizer_1.SyntaxTokenTypes.OpenGroup);
88
+ const lastOpenGroupToken = tokens.findIndex((t) => t.type == tokenizer_1.SyntaxTokenTypes.CloseGroup);
89
+ if (firstOpenGroupToken == 0 &&
90
+ lastOpenGroupToken == tokens.length - 1) {
91
+ tokens.shift();
92
+ tokens.pop();
93
+ }
94
+ // If token starts with NOT group operator,
95
+ // parse remaining tokens as a group, then add NOT group on top
96
+ if (tokens[0].type == tokenizer_1.SyntaxTokenTypes.Not) {
97
+ tokens.splice(0, 1);
98
+ const group = parseFieldGroup(tokens);
99
+ const notGroup = {
100
+ type: 'FieldGroup',
101
+ operator: types_1.FieldGroupOperatorNode.Not,
102
+ children: [group],
103
+ };
104
+ fieldGroup.children.push(notGroup);
105
+ continue;
106
+ }
107
+ // If tokens contains primary group operator,
108
+ // assume this is another depth and recursively build that group
109
+ const tokensGroupOperator = tokens.find((t) => tokenIsPrimaryGroupOperator(t));
110
+ if (tokensGroupOperator != null) {
111
+ const group = parseFieldGroup(tokens);
112
+ fieldGroup.children.push(group);
113
+ continue;
114
+ }
115
+ // If none of the previous conditions match,
116
+ // assume this is a single field selector and parse it
117
+ const fieldSelector = (0, field_1.parseFieldSelector)(tokens);
118
+ fieldGroup.children.push(fieldSelector);
119
+ }
120
+ return fieldGroup;
121
+ }
122
+ function tokenIsPrimaryGroupOperator(token) {
123
+ return [tokenizer_1.SyntaxTokenTypes.And, tokenizer_1.SyntaxTokenTypes.Or].includes(token.type);
124
+ }
125
+ function parsePrimaryGroupOperator(token) {
126
+ const type = token.type;
127
+ if (type == tokenizer_1.SyntaxTokenTypes.And) {
128
+ return types_1.FieldGroupOperatorNode.And;
129
+ }
130
+ else if (type == tokenizer_1.SyntaxTokenTypes.Or) {
131
+ return types_1.FieldGroupOperatorNode.Or;
132
+ }
133
+ throw new error_1.InvalidOrUnexpectedTokens('Unexpected token, unable to parse group operator', [token]);
134
+ }
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L2dyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVVMsMENBQWU7QUFWeEIsb0NBQXFEO0FBRXJELG1DQUE2QztBQUM3QywyQ0FJcUI7QUFDckIsbUNBQWlFO0FBSWpFLFNBQVMsZUFBZSxDQUFDLE1BQXFCO0lBQzFDLDRDQUE0QztJQUM1QywwQkFBMEI7SUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUN4QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSw0QkFBZ0IsQ0FBQyxTQUFTLENBQzlDLENBQUM7SUFDRixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3ZDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLDRCQUFnQixDQUFDLFVBQVUsQ0FDL0MsQ0FBQztJQUNGLElBQUksbUJBQW1CLElBQUksQ0FBQyxJQUFJLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7SUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sYUFBYSxHQUFHLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELFNBQVMsQ0FB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
@@ -0,0 +1,2 @@
1
+ import { QueryNode } from './types';
2
+ export declare function parseQuery(query: string): QueryNode;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseQuery = parseQuery;
4
+ const group_1 = require("./group");
5
+ const tokenizer_1 = require("./tokenizer");
6
+ const types_1 = require("./types");
7
+ function parseQuery(query) {
8
+ const tokens = (0, tokenizer_1.tokenize)(query);
9
+ if (tokens.length == 0) {
10
+ return {
11
+ type: 'Query',
12
+ groups: {
13
+ type: 'FieldGroup',
14
+ operator: types_1.FieldGroupOperatorNode.And,
15
+ children: [],
16
+ },
17
+ };
18
+ }
19
+ const fieldGroups = (0, group_1.parseFieldGroup)(tokens);
20
+ return {
21
+ type: 'Query',
22
+ groups: fieldGroups,
23
+ };
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsZ0NBa0JDO0FBdEJELG1DQUEwQztBQUMxQywyQ0FBdUM7QUFDdkMsbUNBQTREO0FBRTVELFNBQWdCLFVBQVUsQ0FBQyxLQUFhO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQVEsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTztZQUNILElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFO2dCQUNKLElBQUksRUFBRSxZQUFZO2dCQUNsQixRQUFRLEVBQUUsOEJBQXNCLENBQUMsR0FBRztnQkFDcEMsUUFBUSxFQUFFLEVBQUU7YUFDZjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSx1QkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLE9BQU87UUFDSCxJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU0sRUFBRSxXQUFXO0tBQ3RCLENBQUM7QUFDTixDQUFDIn0=
@@ -0,0 +1,36 @@
1
+ export declare enum SyntaxTokenTypes {
2
+ Reference = 0,
3
+ Number = 1,
4
+ Quote = 2,
5
+ QuotedText = 3,
6
+ ReferenceJoin = 4,
7
+ OpenGroup = 5,
8
+ CloseGroup = 6,
9
+ OpenArrayGroup = 7,
10
+ CloseArrayGroup = 8,
11
+ OpenSubQuery = 9,
12
+ CloseSubQuery = 10,
13
+ And = 11,
14
+ Or = 12,
15
+ Not = 13,
16
+ Equal = 14,
17
+ GreaterThan = 15,
18
+ LessThan = 16,
19
+ ILike = 17,
20
+ Regex = 18,
21
+ True = 19,
22
+ False = 20,
23
+ Whitespace = 21,
24
+ InvalidToken = 22
25
+ }
26
+ export interface SyntaxToken {
27
+ type: SyntaxTokenTypes;
28
+ value?: string;
29
+ position: number | [number, number];
30
+ }
31
+ export declare function tokenize(input: string, keepWhitespace?: boolean): SyntaxToken[];
32
+ export declare function findClosingGroupTokenIdx(tokens: SyntaxToken[], startIdx: number, startingGroupToken: SyntaxTokenTypes): number;
33
+ export declare function isGroupToken(tokenType: SyntaxTokenTypes): boolean;
34
+ export declare function isStartingGroupToken(tokenType: SyntaxTokenTypes): boolean;
35
+ export declare function isEndingGroupToken(tokenType: SyntaxTokenTypes): boolean;
36
+ export declare function endingGroupToken(startingGroupTokenType: SyntaxTokenTypes): SyntaxTokenTypes;
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SyntaxTokenTypes = void 0;
4
+ exports.tokenize = tokenize;
5
+ exports.findClosingGroupTokenIdx = findClosingGroupTokenIdx;
6
+ exports.isGroupToken = isGroupToken;
7
+ exports.isStartingGroupToken = isStartingGroupToken;
8
+ exports.isEndingGroupToken = isEndingGroupToken;
9
+ exports.endingGroupToken = endingGroupToken;
10
+ const error_1 = require("../error");
11
+ var SyntaxTokenTypes;
12
+ (function (SyntaxTokenTypes) {
13
+ SyntaxTokenTypes[SyntaxTokenTypes["Reference"] = 0] = "Reference";
14
+ SyntaxTokenTypes[SyntaxTokenTypes["Number"] = 1] = "Number";
15
+ SyntaxTokenTypes[SyntaxTokenTypes["Quote"] = 2] = "Quote";
16
+ SyntaxTokenTypes[SyntaxTokenTypes["QuotedText"] = 3] = "QuotedText";
17
+ SyntaxTokenTypes[SyntaxTokenTypes["ReferenceJoin"] = 4] = "ReferenceJoin";
18
+ SyntaxTokenTypes[SyntaxTokenTypes["OpenGroup"] = 5] = "OpenGroup";
19
+ SyntaxTokenTypes[SyntaxTokenTypes["CloseGroup"] = 6] = "CloseGroup";
20
+ SyntaxTokenTypes[SyntaxTokenTypes["OpenArrayGroup"] = 7] = "OpenArrayGroup";
21
+ SyntaxTokenTypes[SyntaxTokenTypes["CloseArrayGroup"] = 8] = "CloseArrayGroup";
22
+ SyntaxTokenTypes[SyntaxTokenTypes["OpenSubQuery"] = 9] = "OpenSubQuery";
23
+ SyntaxTokenTypes[SyntaxTokenTypes["CloseSubQuery"] = 10] = "CloseSubQuery";
24
+ SyntaxTokenTypes[SyntaxTokenTypes["And"] = 11] = "And";
25
+ SyntaxTokenTypes[SyntaxTokenTypes["Or"] = 12] = "Or";
26
+ SyntaxTokenTypes[SyntaxTokenTypes["Not"] = 13] = "Not";
27
+ SyntaxTokenTypes[SyntaxTokenTypes["Equal"] = 14] = "Equal";
28
+ SyntaxTokenTypes[SyntaxTokenTypes["GreaterThan"] = 15] = "GreaterThan";
29
+ SyntaxTokenTypes[SyntaxTokenTypes["LessThan"] = 16] = "LessThan";
30
+ SyntaxTokenTypes[SyntaxTokenTypes["ILike"] = 17] = "ILike";
31
+ SyntaxTokenTypes[SyntaxTokenTypes["Regex"] = 18] = "Regex";
32
+ SyntaxTokenTypes[SyntaxTokenTypes["True"] = 19] = "True";
33
+ SyntaxTokenTypes[SyntaxTokenTypes["False"] = 20] = "False";
34
+ SyntaxTokenTypes[SyntaxTokenTypes["Whitespace"] = 21] = "Whitespace";
35
+ SyntaxTokenTypes[SyntaxTokenTypes["InvalidToken"] = 22] = "InvalidToken";
36
+ })(SyntaxTokenTypes || (exports.SyntaxTokenTypes = SyntaxTokenTypes = {}));
37
+ const Tokens = {
38
+ '"': SyntaxTokenTypes.Quote,
39
+ "'": SyntaxTokenTypes.Quote,
40
+ '`': SyntaxTokenTypes.Quote,
41
+ '.': SyntaxTokenTypes.ReferenceJoin,
42
+ '(': SyntaxTokenTypes.OpenGroup,
43
+ ')': SyntaxTokenTypes.CloseGroup,
44
+ '[': SyntaxTokenTypes.OpenArrayGroup,
45
+ ']': SyntaxTokenTypes.CloseArrayGroup,
46
+ '{': SyntaxTokenTypes.OpenSubQuery,
47
+ '}': SyntaxTokenTypes.CloseSubQuery,
48
+ and: SyntaxTokenTypes.And,
49
+ '&': SyntaxTokenTypes.And,
50
+ ',': SyntaxTokenTypes.And,
51
+ or: SyntaxTokenTypes.Or,
52
+ '|': SyntaxTokenTypes.Or,
53
+ not: SyntaxTokenTypes.Not,
54
+ '!': SyntaxTokenTypes.Not,
55
+ '=': SyntaxTokenTypes.Equal,
56
+ ':': SyntaxTokenTypes.Equal,
57
+ '>': SyntaxTokenTypes.GreaterThan,
58
+ '<': SyntaxTokenTypes.LessThan,
59
+ ilike: SyntaxTokenTypes.ILike,
60
+ '~': SyntaxTokenTypes.Regex,
61
+ true: SyntaxTokenTypes.True,
62
+ false: SyntaxTokenTypes.False,
63
+ ' ': SyntaxTokenTypes.Whitespace,
64
+ };
65
+ // Normalize an input string by trimming extra spaces.
66
+ function normalize(input) {
67
+ return input.replace(/\s+/g, ' ').trim();
68
+ }
69
+ // Checks if input is a valid reference value.
70
+ // A reference value is a non-empty string containing either
71
+ // alphabetic characters and underscores OR only numeric characters
72
+ // (but not both).
73
+ function validReferenceValue(input) {
74
+ if (input.length === 0)
75
+ return false;
76
+ return /^[a-zA-Z_]+$/.test(input) || /^[0-9]+$/.test(input);
77
+ }
78
+ function tokenize(input, keepWhitespace = false) {
79
+ input = normalize(input);
80
+ const syntaxTokens = [];
81
+ const tokens = input.split('');
82
+ for (let i = 0; i < tokens.length; i++) {
83
+ const previousSyntaxToken = syntaxTokens[syntaxTokens.length - 1];
84
+ const previousEndPosition = previousSyntaxToken
85
+ ? Array.isArray(previousSyntaxToken.position)
86
+ ? previousSyntaxToken.position[1]
87
+ : previousSyntaxToken.position
88
+ : null;
89
+ const startPosition = previousEndPosition != null ? previousEndPosition + 1 : 0;
90
+ const tokenValue = tokens[i];
91
+ const token = {
92
+ type: Tokens[tokenValue.toLowerCase()],
93
+ value: tokenValue,
94
+ position: startPosition,
95
+ };
96
+ // Parse full quoted text as a single token
97
+ if (token.type == SyntaxTokenTypes.Quote) {
98
+ const nextTokens = tokens.slice(i + 1);
99
+ const endQuoteTokenIncludedIdx = nextTokens.findIndex((t) => t == token.value);
100
+ if (endQuoteTokenIncludedIdx == -1) {
101
+ // TODO: throw error
102
+ throw new Error('Quote must have a closing token');
103
+ }
104
+ const quoteTokens = [
105
+ tokenValue,
106
+ ...tokens.splice(i + 1, endQuoteTokenIncludedIdx + 1),
107
+ ];
108
+ const quoteToken = quoteTokens.join('');
109
+ const quoteTokenUnquoted = quoteToken.slice(1, -1);
110
+ token.type = SyntaxTokenTypes.QuotedText;
111
+ token.value = quoteTokenUnquoted;
112
+ token.position = [
113
+ startPosition,
114
+ startPosition + endQuoteTokenIncludedIdx + 1,
115
+ ];
116
+ }
117
+ // Attempt to parse multi-character tokens and references
118
+ if (token.type == null) {
119
+ const nextTokens = tokens.slice(i + 1);
120
+ let endWordExcludedIdx = nextTokens.findIndex((t) => {
121
+ return !t.match(/\w/g);
122
+ });
123
+ if (endWordExcludedIdx == -1) {
124
+ endWordExcludedIdx = nextTokens.length;
125
+ }
126
+ const word = tokens.slice(i, i + endWordExcludedIdx + 1).join('');
127
+ const wordTokenType = Tokens[word.toLowerCase()];
128
+ if (wordTokenType != null) {
129
+ tokens.splice(i + 1, endWordExcludedIdx);
130
+ token.type = wordTokenType;
131
+ token.value = word;
132
+ token.position = [
133
+ startPosition,
134
+ startPosition + endWordExcludedIdx,
135
+ ];
136
+ }
137
+ else if (!isNaN(parseFloat(word)) &&
138
+ parseFloat(word).toString() == word) {
139
+ tokens.splice(i + 1, endWordExcludedIdx);
140
+ token.type = SyntaxTokenTypes.Number;
141
+ token.value = word;
142
+ token.position = [
143
+ startPosition,
144
+ startPosition + endWordExcludedIdx,
145
+ ];
146
+ }
147
+ else if (validReferenceValue(word)) {
148
+ tokens.splice(i + 1, endWordExcludedIdx);
149
+ token.type = SyntaxTokenTypes.Reference;
150
+ token.value = word;
151
+ token.position = [
152
+ startPosition,
153
+ startPosition + endWordExcludedIdx,
154
+ ];
155
+ }
156
+ }
157
+ if (token.type == null) {
158
+ throw new error_1.InvalidOrUnexpectedTokens('Unknown token', [token]);
159
+ }
160
+ if (Array.isArray(token.position) &&
161
+ token.position[0] == token.position[1]) {
162
+ token.position = token.position[0];
163
+ }
164
+ syntaxTokens.push(token);
165
+ }
166
+ if (!keepWhitespace) {
167
+ const syntaxTokensWithoutWhitespace = syntaxTokens.filter((t) => t.type != SyntaxTokenTypes.Whitespace);
168
+ return syntaxTokensWithoutWhitespace;
169
+ }
170
+ else {
171
+ return syntaxTokens;
172
+ }
173
+ }
174
+ function findClosingGroupTokenIdx(tokens, startIdx, startingGroupToken) {
175
+ const endingTokenType = endingGroupToken(startingGroupToken);
176
+ for (let i = startIdx; i < tokens.length; i++) {
177
+ const token = tokens[i];
178
+ if (isStartingGroupToken(token.type)) {
179
+ const endPosition = findClosingGroupTokenIdx(tokens, i + 1, token.type);
180
+ i = endPosition + 1;
181
+ continue;
182
+ }
183
+ if (isEndingGroupToken(token.type)) {
184
+ if (token.type == endingTokenType) {
185
+ return i;
186
+ }
187
+ throw new error_1.InvalidOrUnexpectedTokens('Unexpected token, no group starting token', [token]);
188
+ }
189
+ }
190
+ throw new error_1.InvalidOrUnexpectedTokens('Invalid tokens, expected group to end', tokens.slice(startIdx));
191
+ }
192
+ function isGroupToken(tokenType) {
193
+ return isStartingGroupToken(tokenType) || isEndingGroupToken(tokenType);
194
+ }
195
+ function isStartingGroupToken(tokenType) {
196
+ return [
197
+ SyntaxTokenTypes.OpenGroup,
198
+ SyntaxTokenTypes.OpenArrayGroup,
199
+ SyntaxTokenTypes.OpenSubQuery,
200
+ ].includes(tokenType);
201
+ }
202
+ function isEndingGroupToken(tokenType) {
203
+ return [
204
+ SyntaxTokenTypes.CloseGroup,
205
+ SyntaxTokenTypes.CloseArrayGroup,
206
+ SyntaxTokenTypes.CloseSubQuery,
207
+ ].includes(tokenType);
208
+ }
209
+ function endingGroupToken(startingGroupTokenType) {
210
+ switch (startingGroupTokenType) {
211
+ case SyntaxTokenTypes.OpenGroup:
212
+ return SyntaxTokenTypes.CloseGroup;
213
+ case SyntaxTokenTypes.OpenArrayGroup:
214
+ return SyntaxTokenTypes.CloseArrayGroup;
215
+ case SyntaxTokenTypes.OpenSubQuery:
216
+ return SyntaxTokenTypes.CloseSubQuery;
217
+ }
218
+ throw new error_1.InvalidOrUnexpectedTokens(`Unknown starting group token ${startingGroupTokenType}`, []);
219
+ }
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FzdC90b2tlbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBOEVBLDRCQWdIQztBQUVELDREQW1DQztBQUVELG9DQUVDO0FBRUQsb0RBTUM7QUFFRCxnREFNQztBQUVELDRDQWdCQztBQXpRRCxvQ0FBcUQ7QUFFckQsSUFBWSxnQkF3Qlg7QUF4QkQsV0FBWSxnQkFBZ0I7SUFDeEIsaUVBQVMsQ0FBQTtJQUNULDJEQUFNLENBQUE7SUFDTix5REFBSyxDQUFBO0lBQ0wsbUVBQVUsQ0FBQTtJQUNWLHlFQUFhLENBQUE7SUFDYixpRUFBUyxDQUFBO0lBQ1QsbUVBQVUsQ0FBQTtJQUNWLDJFQUFjLENBQUE7SUFDZCw2RUFBZSxDQUFBO0lBQ2YsdUVBQVksQ0FBQTtJQUNaLDBFQUFhLENBQUE7SUFDYixzREFBRyxDQUFBO0lBQ0gsb0RBQUUsQ0FBQTtJQUNGLHNEQUFHLENBQUE7SUFDSCwwREFBSyxDQUFBO0lBQ0wsc0VBQVcsQ0FBQTtJQUNYLGdFQUFRLENBQUE7SUFDUiwwREFBSyxDQUFBO0lBQ0wsMERBQUssQ0FBQTtJQUNMLHdEQUFJLENBQUE7SUFDSiwwREFBSyxDQUFBO0lBQ0wsb0VBQVUsQ0FBQTtJQUNWLHdFQUFZLENBQUE7QUFDaEIsQ0FBQyxFQXhCVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQXdCM0I7QUFHRCxNQUFNLE1BQU0sR0FBRztJQUNYLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzNCLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzNCLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzNCLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO0lBQ25DLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO0lBQy9CLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVO0lBQ2hDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFj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
@@ -0,0 +1,49 @@
1
+ import { SyntaxToken } from './tokenizer';
2
+ export interface QueryNode {
3
+ type: 'Query';
4
+ groups: FieldGroupNode;
5
+ }
6
+ export declare enum FieldGroupOperatorNode {
7
+ And = 0,
8
+ Or = 1,
9
+ Not = 2
10
+ }
11
+ export interface FieldGroupNode {
12
+ type: 'FieldGroup';
13
+ operator: FieldGroupOperatorNode;
14
+ children: (FieldSelectorNode | FieldGroupNode)[];
15
+ }
16
+ export interface FieldSelectorNode {
17
+ type: 'FieldSelector';
18
+ reference: FieldReferenceNode;
19
+ operator: FieldOperatorNode;
20
+ value: FieldSelectorValueNode;
21
+ }
22
+ export interface FieldReferenceNode {
23
+ type: 'FieldReference';
24
+ paths: SyntaxToken[];
25
+ }
26
+ export declare enum FieldOperatorNode {
27
+ Equal = 0,
28
+ NotEqual = 1,
29
+ GreaterThan = 2,
30
+ GreaterThanOrEqual = 3,
31
+ LessThan = 4,
32
+ LessThanOrEqual = 5,
33
+ ILike = 6,
34
+ Regex = 7,
35
+ Exists = 8
36
+ }
37
+ export type FieldSelectorValueNode = FieldSelectorValueLiteralNode | FieldSelectorValueExistsNode | FieldReferenceNode | SubFieldSelectorsNode | QueryNode;
38
+ export interface FieldSelectorValueLiteralNode {
39
+ type: 'FieldSelectorValueLiteral';
40
+ token: SyntaxToken;
41
+ }
42
+ export interface FieldSelectorValueExistsNode {
43
+ type: 'FieldSelectorValueExists';
44
+ token: SyntaxToken;
45
+ }
46
+ export interface SubFieldSelectorsNode {
47
+ type: 'SubFieldSelectors';
48
+ children: FieldSelectorNode[];
49
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldOperatorNode = exports.FieldGroupOperatorNode = void 0;
4
+ var FieldGroupOperatorNode;
5
+ (function (FieldGroupOperatorNode) {
6
+ FieldGroupOperatorNode[FieldGroupOperatorNode["And"] = 0] = "And";
7
+ FieldGroupOperatorNode[FieldGroupOperatorNode["Or"] = 1] = "Or";
8
+ FieldGroupOperatorNode[FieldGroupOperatorNode["Not"] = 2] = "Not";
9
+ })(FieldGroupOperatorNode || (exports.FieldGroupOperatorNode = FieldGroupOperatorNode = {}));
10
+ var FieldOperatorNode;
11
+ (function (FieldOperatorNode) {
12
+ FieldOperatorNode[FieldOperatorNode["Equal"] = 0] = "Equal";
13
+ FieldOperatorNode[FieldOperatorNode["NotEqual"] = 1] = "NotEqual";
14
+ FieldOperatorNode[FieldOperatorNode["GreaterThan"] = 2] = "GreaterThan";
15
+ FieldOperatorNode[FieldOperatorNode["GreaterThanOrEqual"] = 3] = "GreaterThanOrEqual";
16
+ FieldOperatorNode[FieldOperatorNode["LessThan"] = 4] = "LessThan";
17
+ FieldOperatorNode[FieldOperatorNode["LessThanOrEqual"] = 5] = "LessThanOrEqual";
18
+ FieldOperatorNode[FieldOperatorNode["ILike"] = 6] = "ILike";
19
+ FieldOperatorNode[FieldOperatorNode["Regex"] = 7] = "Regex";
20
+ FieldOperatorNode[FieldOperatorNode["Exists"] = 8] = "Exists";
21
+ })(FieldOperatorNode || (exports.FieldOperatorNode = FieldOperatorNode = {}));
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLElBQVksc0JBSVg7QUFKRCxXQUFZLHNCQUFzQjtJQUM5QixpRUFBRyxDQUFBO0lBQ0gsK0RBQUUsQ0FBQTtJQUNGLGlFQUFHLENBQUE7QUFDUCxDQUFDLEVBSlcsc0JBQXNCLHNDQUF0QixzQkFBc0IsUUFJakM7QUFvQkQsSUFBWSxpQkFVWDtBQVZELFdBQVksaUJBQWlCO0lBQ3pCLDJEQUFLLENBQUE7SUFDTCxpRUFBUSxDQUFBO0lBQ1IsdUVBQVcsQ0FBQTtJQUNYLHFGQUFrQixDQUFBO0lBQ2xCLGlFQUFRLENBQUE7SUFDUiwrRUFBZSxDQUFBO0lBQ2YsMkRBQUssQ0FBQTtJQUNMLDJEQUFLLENBQUE7SUFDTCw2REFBTSxDQUFBO0FBQ1YsQ0FBQyxFQVZXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBVTVCIn0=
@@ -0,0 +1,3 @@
1
+ import { QueryField } from 'night-rest-api/generated';
2
+ import { FieldSelectorNode } from '../ast/types';
3
+ export declare function compileFieldSelector(astFieldSelector: FieldSelectorNode, fieldId?: number): QueryField;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileFieldSelector = compileFieldSelector;
4
+ const tokenizer_1 = require("../ast/tokenizer");
5
+ const types_1 = require("../ast/types");
6
+ function compileFieldSelector(astFieldSelector, fieldId = 0) {
7
+ // Extract query module id and field path from AST field selector reference
8
+ const reference = astFieldSelector.reference;
9
+ const referencePaths = reference.paths.map((p) => p.value);
10
+ const moduleId = referencePaths.shift();
11
+ const fieldPath = referencePaths;
12
+ // Construct selector based on AST field selector operator and value
13
+ const fieldSelectorOperator = astFieldSelector.operator;
14
+ const fieldSelectorValue = astFieldSelector.value;
15
+ let selector = null;
16
+ if (fieldSelectorValue.type == 'FieldSelectorValueLiteral') {
17
+ const valueToken = fieldSelectorValue.token;
18
+ const value = valueToken.value;
19
+ switch (valueToken.type) {
20
+ case tokenizer_1.SyntaxTokenTypes.QuotedText:
21
+ selector = {
22
+ text: {
23
+ eq: fieldSelectorOperator == types_1.FieldOperatorNode.Equal
24
+ ? value
25
+ : undefined,
26
+ ilike: fieldSelectorOperator == types_1.FieldOperatorNode.ILike
27
+ ? value
28
+ : undefined,
29
+ regex: fieldSelectorOperator == types_1.FieldOperatorNode.Regex
30
+ ? value
31
+ : undefined,
32
+ },
33
+ };
34
+ break;
35
+ case tokenizer_1.SyntaxTokenTypes.False:
36
+ case tokenizer_1.SyntaxTokenTypes.True:
37
+ selector = {
38
+ bool: {
39
+ eq: valueToken.type == tokenizer_1.SyntaxTokenTypes.True,
40
+ },
41
+ };
42
+ break;
43
+ case tokenizer_1.SyntaxTokenTypes.Number: {
44
+ const valueNumber = parseFloat(value);
45
+ selector = {
46
+ number: {
47
+ eq: fieldSelectorOperator == types_1.FieldOperatorNode.Equal
48
+ ? valueNumber
49
+ : undefined,
50
+ gt: fieldSelectorOperator ==
51
+ types_1.FieldOperatorNode.GreaterThan
52
+ ? valueNumber
53
+ : fieldSelectorOperator ==
54
+ types_1.FieldOperatorNode.GreaterThanOrEqual
55
+ ? valueNumber - 1
56
+ : null,
57
+ lt: fieldSelectorOperator == types_1.FieldOperatorNode.LessThan
58
+ ? valueNumber
59
+ : fieldSelectorOperator ==
60
+ types_1.FieldOperatorNode.LessThanOrEqual
61
+ ? valueNumber + 1
62
+ : undefined,
63
+ },
64
+ };
65
+ }
66
+ }
67
+ }
68
+ if (!selector) {
69
+ throw new Error('Unable to parse AST, unknown selector');
70
+ }
71
+ return {
72
+ id: fieldId,
73
+ path: fieldPath,
74
+ module_id: moduleId,
75
+ selector: selector,
76
+ };
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZXIvZmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxvREFzRkM7QUF6RkQsZ0RBQW9EO0FBQ3BELHdDQUFvRTtBQUVwRSxTQUFnQixvQkFBb0IsQ0FDaEMsZ0JBQW1DLEVBQ25DLE9BQU8sR0FBRyxDQUFDO0lBRVgsMkVBQTJFO0lBQzNFLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztJQUM3QyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBRTVELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUcsQ0FBQztJQUN6QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUM7SUFFakMsb0VBQW9FO0lBQ3BFLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3hELE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBRWxELElBQUksUUFBUSxHQUE4QixJQUFJLENBQUM7SUFFL0MsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLElBQUksMkJBQTJCLEVBQUUsQ0FBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQU0sQ0FBQztRQUNoQyxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixLQUFLLDRCQUFnQixDQUFDLFVBQVU7Z0JBQzVCLFFBQVEsR0FBRztvQkFDUCxJQUFJLEVBQUU7d0JBQ0YsRUFBRSxFQUNFLHFCQUFxQixJQUFJLHlCQUFpQixDQUFDLEtBQUs7NEJBQzVDLENBQUMsQ0FBQyxLQUFLOzRCQUNQLENBQUMsQ0FBQyxTQUFTO3dCQUNuQixLQUFLLEVBQ0QscUJBQXFCLElBQUkseUJBQWlCLENBQUMsS0FBSzs0QkFDNUMsQ0FBQyxDQUFDLEtBQUs7NEJBQ1AsQ0FBQyxDQUFDLFNBQVM7d0JBQ25CLEtBQUssRUFDRCxxQkFBcUIsSUFBSSx5QkFBaUIsQ0FBQyxLQUFLOzRCQUM1QyxDQUFDLENBQUMsS0FBSzs0QkFDUCxDQUFDLENBQUMsU0FBUztxQkFDdEI7aUJBQ0osQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyw0QkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDNUIsS0FBSyw0QkFBZ0IsQ0FBQyxJQUFJO2dCQUN0QixRQUFRLEdBQUc7b0JBQ1AsSUFBSSxFQUFFO3dCQUNGLEVBQUUsRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLDRCQUFnQixDQUFDLElBQUk7cUJBQy9DO2lCQUNKLENBQUM7Z0JBQ0YsTUFBTTtZQUNWLEtBQUssNEJBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxRQUFRLEdBQUc7b0JBQ1AsTUFBTSxFQUFFO3dCQUNKLEVBQUUsRUFDRSxxQkFBcUIsSUFBSSx5QkFBaUIsQ0FBQyxLQUFLOzRCQUM1QyxDQUFDLENBQUMsV0FBVzs0QkFDYixDQUFDLENBQUMsU0FBUzt3QkFDbkIsRUFBRSxFQUNFLHFCQUFxQjs0QkFDckIseUJBQWlCLENBQUMsV0FBVzs0QkFDekIsQ0FBQyxDQUFDLFdBQVc7NEJBQ2IsQ0FBQyxDQUFDLHFCQUFxQjtnQ0FDbkIseUJBQWlCLENBQUMsa0JBQWtCO2dDQUN0QyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUM7Z0NBQ2pCLENBQUMsQ0FBQyxJQUFJO3dCQUNoQixFQUFFLEVBQ0UscUJBQXFCLElBQUkseUJBQWlCLENBQUMsUUFBUTs0QkFDL0MsQ0FBQyxDQUFDLFdBQVc7NEJBQ2IsQ0FBQyxDQUFDLHFCQUFxQjtnQ0FDbkIseUJBQWlCLENBQUMsZUFBZTtnQ0FDbkMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDO2dDQUNqQixDQUFDLENBQUMsU0FBUztxQkFDeEI7aUJBQ0osQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsT0FBTztRQUNILEVBQUUsRUFBRSxPQUFPO1FBQ1gsSUFBSSxFQUFFLFNBQVM7UUFDZixTQUFTLEVBQUUsUUFBUTtRQUNuQixRQUFRLEVBQUUsUUFBUztLQUN0QixDQUFDO0FBQ04sQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import { QueryField, QueryGroup } from 'night-rest-api/generated';
2
+ import { FieldGroupNode } from '../ast/types';
3
+ export declare function compileFieldGroup(fieldGroup: FieldGroupNode, fieldIdStart?: number): [QueryGroup, QueryField[]];
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileFieldGroup = compileFieldGroup;
4
+ const generated_1 = require("night-rest-api/generated");
5
+ const types_1 = require("../ast/types");
6
+ const field_1 = require("./field");
7
+ function compileFieldGroup(fieldGroup, fieldIdStart = 0) {
8
+ const fields = [];
9
+ const children = [];
10
+ // Match operator
11
+ let operator;
12
+ switch (fieldGroup.operator) {
13
+ case types_1.FieldGroupOperatorNode.And:
14
+ operator = generated_1.QueryFieldGroupOperator.AND;
15
+ break;
16
+ case types_1.FieldGroupOperatorNode.Not:
17
+ operator = generated_1.QueryFieldGroupOperator.NOT;
18
+ break;
19
+ case types_1.FieldGroupOperatorNode.Or:
20
+ operator = generated_1.QueryFieldGroupOperator.OR;
21
+ break;
22
+ }
23
+ // Compile children
24
+ for (const child of fieldGroup.children) {
25
+ if (child.type == 'FieldSelector') {
26
+ const field = (0, field_1.compileFieldSelector)(child, fields.length + fieldIdStart);
27
+ fields.push(field);
28
+ children.push(field.id);
29
+ }
30
+ else if (child.type == 'FieldGroup') {
31
+ const [combiledFieldGroup, newFields] = compileFieldGroup(child, fields.length + fieldIdStart);
32
+ children.push(combiledFieldGroup);
33
+ fields.push(...newFields);
34
+ }
35
+ }
36
+ return [[operator, children], fields];
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZXIvZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw4Q0F5Q0M7QUFwREQsd0RBS2tDO0FBRWxDLHdDQUFzRTtBQUV0RSxtQ0FBK0M7QUFFL0MsU0FBZ0IsaUJBQWlCLENBQzdCLFVBQTBCLEVBQzFCLFlBQVksR0FBRyxDQUFDO0lBRWhCLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDaEMsTUFBTSxRQUFRLEdBQXNCLEVBQUUsQ0FBQztJQUV2QyxpQkFBaUI7SUFDakIsSUFBSSxRQUFpQyxDQUFDO0lBQ3RDLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLEtBQUssOEJBQXNCLENBQUMsR0FBRztZQUMzQixRQUFRLEdBQUcsbUNBQXVCLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLE1BQU07UUFDVixLQUFLLDhCQUFzQixDQUFDLEdBQUc7WUFDM0IsUUFBUSxHQUFHLG1DQUF1QixDQUFDLEdBQUcsQ0FBQztZQUN2QyxNQUFNO1FBQ1YsS0FBSyw4QkFBc0IsQ0FBQyxFQUFFO1lBQzFCLFFBQVEsR0FBRyxtQ0FBdUIsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTTtJQUNkLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUEsNEJBQW9CLEVBQzlCLEtBQUssRUFDTCxNQUFNLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FDL0IsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLEdBQUcsaUJBQWlCLENBQ3JELEtBQUssRUFDTCxNQUFNLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FDL0IsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import { Query } from 'night-rest-api/generated';
2
+ import { QueryNode } from '../ast/types';
3
+ export declare function compileQuery(query: QueryNode): Query;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileQuery = compileQuery;
4
+ const group_1 = require("./group");
5
+ function compileQuery(query) {
6
+ const [compiledGroups, fields] = (0, group_1.compileFieldGroup)(query.groups);
7
+ return { fields, grouping: compiledGroups };
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZXIvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxvQ0FHQztBQUxELG1DQUE0QztBQUU1QyxTQUFnQixZQUFZLENBQUMsS0FBZ0I7SUFDekMsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFpQixFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUNoRCxDQUFDIn0=
@@ -0,0 +1,6 @@
1
+ import { SyntaxToken } from './ast/tokenizer';
2
+ export declare class InvalidOrUnexpectedTokens extends Error {
3
+ tokens: SyntaxToken[];
4
+ constructor(message: string, tokens: SyntaxToken[]);
5
+ range(): [number, number];
6
+ }
package/build/error.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidOrUnexpectedTokens = void 0;
4
+ class InvalidOrUnexpectedTokens extends Error {
5
+ tokens;
6
+ constructor(message, tokens) {
7
+ super(message);
8
+ this.tokens = tokens;
9
+ }
10
+ range() {
11
+ const endIndex = this.tokens.length - 1;
12
+ const startRange = Array.isArray(this.tokens[0].position)
13
+ ? this.tokens[0].position[0]
14
+ : this.tokens[0].position;
15
+ const endRange = Array.isArray(this.tokens[endIndex].position)
16
+ ? this.tokens[endIndex].position[1]
17
+ : this.tokens[endIndex].position;
18
+ return [startRange, endRange + 1];
19
+ }
20
+ }
21
+ exports.InvalidOrUnexpectedTokens = InvalidOrUnexpectedTokens;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBYSx5QkFBMEIsU0FBUSxLQUFLO0lBQ3pDLE1BQU0sQ0FBZ0I7SUFFN0IsWUFBWSxPQUFlLEVBQUUsTUFBcUI7UUFDOUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUs7UUFDUixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDSjtBQWxCRCw4REFrQkMifQ==
package/build/lib.d.ts ADDED
File without changes
package/build/lib.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "night-query-parser",
3
+ "version": "0.0.1",
4
+ "exports": {
5
+ "./*": "./build/*.js"
6
+ },
7
+ "files": [
8
+ "build/",
9
+ "package.json",
10
+ "README.md"
11
+ ],
12
+ "dependencies": {
13
+ "night-rest-api": "0.0.1"
14
+ },
15
+ "devDependencies": {
16
+ "@jest/globals": "^30.3.0",
17
+ "@types/lodash": "^4.17.24",
18
+ "jest": "^30.3.0",
19
+ "ts-jest": "^29.4.9",
20
+ "typescript": "^6.0.2"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "test": "jest",
25
+ "prepublish": "pnpm build"
26
+ }
27
+ }