@react-querybuilder/core 8.15.0 → 8.16.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 +114 -53
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +95 -17
- package/dist/cjs/react-querybuilder_core.cjs.development.js +425 -24
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +95 -17
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/convertQuery-BeJJH9BI.mjs.map +1 -1
- package/dist/convertQuery-Lx2HQa0m.js.map +1 -1
- package/dist/formatQuery.d.mts +72 -2
- package/dist/formatQuery.d.ts +72 -2
- package/dist/formatQuery.js +425 -24
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +418 -25
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-0wp72lLT.d.mts → import-BC_bAKQ8.d.mts} +2 -2
- package/dist/{import-yRVJh7E1.d.ts → import-D1KnXhkQ.d.ts} +2 -2
- package/dist/{index-D5TXNIzF.d.ts → index-AAZg4Uh1.d.mts} +15 -8
- package/dist/{index-Lht_Wq3V.d.mts → index-Ds06V0zO.d.ts} +15 -8
- package/dist/objectUtils-Bzug_QfX.js.map +1 -1
- package/dist/objectUtils-D96eEEzL.mjs.map +1 -1
- package/dist/parseCEL.d.mts +2 -2
- package/dist/parseCEL.d.ts +2 -2
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +49 -0
- package/dist/parseCypher.d.ts +49 -0
- package/dist/parseCypher.js +578 -0
- package/dist/parseCypher.js.map +1 -0
- package/dist/parseCypher.mjs +575 -0
- package/dist/parseCypher.mjs.map +1 -0
- package/dist/parseGremlin.d.mts +35 -0
- package/dist/parseGremlin.d.ts +35 -0
- package/dist/parseGremlin.js +192 -0
- package/dist/parseGremlin.js.map +1 -0
- package/dist/parseGremlin.mjs +191 -0
- package/dist/parseGremlin.mjs.map +1 -0
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.d.mts +2 -2
- package/dist/parseJsonLogic.d.ts +2 -2
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.d.mts +2 -2
- package/dist/parseMongoDB.d.ts +2 -2
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.d.mts +34 -0
- package/dist/parseSPARQL.d.ts +34 -0
- package/dist/parseSPARQL.js +253 -0
- package/dist/parseSPARQL.js.map +1 -0
- package/dist/parseSPARQL.mjs +251 -0
- package/dist/parseSPARQL.mjs.map +1 -0
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs.map +1 -1
- package/dist/parseSpEL.d.mts +2 -2
- package/dist/parseSpEL.d.ts +2 -2
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -1
- package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -1
- package/dist/react-querybuilder_core.d.mts +95 -17
- package/dist/react-querybuilder_core.legacy-esm.d.ts +95 -17
- package/dist/react-querybuilder_core.legacy-esm.js +435 -37
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +418 -25
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +95 -17
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.d.mts +1 -1
- package/dist/transformQuery.d.ts +1 -1
- package/dist/transformQuery.js.map +1 -1
- package/dist/transformQuery.mjs.map +1 -1
- package/dist/utils-ChLG90DP.mjs.map +1 -1
- package/dist/utils-Qwkq2Q0F.js.map +1 -1
- package/formatQuery/package.json +1 -1
- package/package.json +51 -7
- package/parseCEL/package.json +1 -1
- package/parseCypher/package.json +4 -0
- package/parseGremlin/package.json +4 -0
- package/parseJSONata/package.json +1 -1
- package/parseJsonLogic/package.json +1 -1
- package/parseMongoDB/package.json +1 -1
- package/parseSPARQL/package.json +4 -0
- package/parseSQL/package.json +1 -1
- package/parseSpEL/package.json +1 -1
- package/transformQuery/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { E as DefaultRuleGroupType, x as DefaultRuleGroupTypeIC } from "./index-Ds06V0zO.js";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/parseGremlin/parseGremlin.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Options for {@link parseGremlin}.
|
|
6
|
+
*/
|
|
7
|
+
interface ParseGremlinOptions {
|
|
8
|
+
independentCombinators?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parses a Gremlin traversal string into a {@link DefaultRuleGroupType}.
|
|
12
|
+
*
|
|
13
|
+
* Accepts a full Gremlin traversal or a chain of `.has()` steps.
|
|
14
|
+
* Pattern steps (`.hasLabel()`, `.out()`, `.in()`, `.both()`, `.as()`) are
|
|
15
|
+
* consumed but discarded — only `.has()` filter predicates are returned.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Full traversal — extracts .has() conditions only
|
|
20
|
+
* parseGremlin("g.V().hasLabel('Person').has('age', gt(30))");
|
|
21
|
+
*
|
|
22
|
+
* // Bare .has() chain
|
|
23
|
+
* parseGremlin(".has('age', gt(30)).has('name', 'Alice')");
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function parseGremlin(gremlin: string): DefaultRuleGroupType;
|
|
27
|
+
declare function parseGremlin(gremlin: string, options: Omit<ParseGremlinOptions, "independentCombinators"> & {
|
|
28
|
+
independentCombinators?: false;
|
|
29
|
+
}): DefaultRuleGroupType;
|
|
30
|
+
declare function parseGremlin(gremlin: string, options: Omit<ParseGremlinOptions, "independentCombinators"> & {
|
|
31
|
+
independentCombinators: true;
|
|
32
|
+
}): DefaultRuleGroupTypeIC;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { type ParseGremlinOptions, parseGremlin };
|
|
35
|
+
//# sourceMappingURL=parseGremlin.d.ts.map
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/utils/parseGremlin/parseGremlin.ts
|
|
3
|
+
function parseGremlin(gremlin, _options) {
|
|
4
|
+
const trimmed = gremlin.trim();
|
|
5
|
+
if (!trimmed) return {
|
|
6
|
+
combinator: "and",
|
|
7
|
+
rules: []
|
|
8
|
+
};
|
|
9
|
+
const rules = [];
|
|
10
|
+
const steps = tokenizeGremlinSteps(trimmed);
|
|
11
|
+
for (const step of steps) {
|
|
12
|
+
if (step.startsWith("hasLabel(")) continue;
|
|
13
|
+
if (step.startsWith("as(")) continue;
|
|
14
|
+
if (/^(out|in|both)\(/.test(step)) continue;
|
|
15
|
+
if (/^[VE]\(/.test(step)) continue;
|
|
16
|
+
const hasNotMatch = step.match(/^hasNot\('([^']+)'\)$/);
|
|
17
|
+
if (hasNotMatch) {
|
|
18
|
+
rules.push({
|
|
19
|
+
field: hasNotMatch[1],
|
|
20
|
+
operator: "null",
|
|
21
|
+
value: null
|
|
22
|
+
});
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const hasExistsMatch = step.match(/^has\('([^']+)'\)$/);
|
|
26
|
+
if (hasExistsMatch) {
|
|
27
|
+
rules.push({
|
|
28
|
+
field: hasExistsMatch[1],
|
|
29
|
+
operator: "notNull",
|
|
30
|
+
value: null
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const hasEqMatch = step.match(/^has\('([^']+)',\s*(.+)\)$/);
|
|
35
|
+
if (hasEqMatch) {
|
|
36
|
+
const [, prop, rawValue] = hasEqMatch;
|
|
37
|
+
const parsed = parseGremlinPredicate(prop, rawValue.trim());
|
|
38
|
+
if (parsed) rules.push(parsed);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
combinator: "and",
|
|
44
|
+
rules
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Tokenizes a Gremlin traversal string into individual step strings. */
|
|
48
|
+
const tokenizeGremlinSteps = (gremlin) => {
|
|
49
|
+
const steps = [];
|
|
50
|
+
let str = gremlin.trim();
|
|
51
|
+
const sourceMatch = str.match(/^\w+\.V\(\)\./);
|
|
52
|
+
if (sourceMatch) str = str.slice(sourceMatch[0].length);
|
|
53
|
+
else if (str.startsWith(".")) str = str.slice(1);
|
|
54
|
+
let depth = 0;
|
|
55
|
+
let current = "";
|
|
56
|
+
for (let i = 0; i < str.length; i++) {
|
|
57
|
+
const ch = str[i];
|
|
58
|
+
if (ch === "(") depth++;
|
|
59
|
+
else if (ch === ")") depth--;
|
|
60
|
+
if (ch === "." && depth === 0) {
|
|
61
|
+
if (current.trim()) steps.push(current.trim());
|
|
62
|
+
current = "";
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
current += ch;
|
|
66
|
+
}
|
|
67
|
+
if (current.trim()) steps.push(current.trim());
|
|
68
|
+
return steps;
|
|
69
|
+
};
|
|
70
|
+
/** Parses a Gremlin predicate (the second argument of `.has()`). */
|
|
71
|
+
const parseGremlinPredicate = (prop, rawValue) => {
|
|
72
|
+
const predicateMatch = rawValue.match(/^(\w+)\((.+)\)$/);
|
|
73
|
+
if (predicateMatch) {
|
|
74
|
+
const [, predName, args] = predicateMatch;
|
|
75
|
+
const parsedArgs = parseGremlinArgs(args);
|
|
76
|
+
switch (predName) {
|
|
77
|
+
case "gt": return {
|
|
78
|
+
field: prop,
|
|
79
|
+
operator: ">",
|
|
80
|
+
value: parsedArgs[0]
|
|
81
|
+
};
|
|
82
|
+
case "lt": return {
|
|
83
|
+
field: prop,
|
|
84
|
+
operator: "<",
|
|
85
|
+
value: parsedArgs[0]
|
|
86
|
+
};
|
|
87
|
+
case "gte": return {
|
|
88
|
+
field: prop,
|
|
89
|
+
operator: ">=",
|
|
90
|
+
value: parsedArgs[0]
|
|
91
|
+
};
|
|
92
|
+
case "lte": return {
|
|
93
|
+
field: prop,
|
|
94
|
+
operator: "<=",
|
|
95
|
+
value: parsedArgs[0]
|
|
96
|
+
};
|
|
97
|
+
case "neq": return {
|
|
98
|
+
field: prop,
|
|
99
|
+
operator: "!=",
|
|
100
|
+
value: parsedArgs[0]
|
|
101
|
+
};
|
|
102
|
+
case "within": return {
|
|
103
|
+
field: prop,
|
|
104
|
+
operator: "in",
|
|
105
|
+
value: parsedArgs
|
|
106
|
+
};
|
|
107
|
+
case "without": return {
|
|
108
|
+
field: prop,
|
|
109
|
+
operator: "notIn",
|
|
110
|
+
value: parsedArgs
|
|
111
|
+
};
|
|
112
|
+
case "between": return {
|
|
113
|
+
field: prop,
|
|
114
|
+
operator: "between",
|
|
115
|
+
value: parsedArgs.slice(0, 2)
|
|
116
|
+
};
|
|
117
|
+
case "outside": return {
|
|
118
|
+
field: prop,
|
|
119
|
+
operator: "notBetween",
|
|
120
|
+
value: parsedArgs.slice(0, 2)
|
|
121
|
+
};
|
|
122
|
+
case "containing": return {
|
|
123
|
+
field: prop,
|
|
124
|
+
operator: "contains",
|
|
125
|
+
value: parsedArgs[0]
|
|
126
|
+
};
|
|
127
|
+
case "notContaining": return {
|
|
128
|
+
field: prop,
|
|
129
|
+
operator: "doesNotContain",
|
|
130
|
+
value: parsedArgs[0]
|
|
131
|
+
};
|
|
132
|
+
case "startingWith": return {
|
|
133
|
+
field: prop,
|
|
134
|
+
operator: "beginsWith",
|
|
135
|
+
value: parsedArgs[0]
|
|
136
|
+
};
|
|
137
|
+
case "notStartingWith": return {
|
|
138
|
+
field: prop,
|
|
139
|
+
operator: "doesNotBeginWith",
|
|
140
|
+
value: parsedArgs[0]
|
|
141
|
+
};
|
|
142
|
+
case "endingWith": return {
|
|
143
|
+
field: prop,
|
|
144
|
+
operator: "endsWith",
|
|
145
|
+
value: parsedArgs[0]
|
|
146
|
+
};
|
|
147
|
+
case "notEndingWith": return {
|
|
148
|
+
field: prop,
|
|
149
|
+
operator: "doesNotEndWith",
|
|
150
|
+
value: parsedArgs[0]
|
|
151
|
+
};
|
|
152
|
+
default: return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
field: prop,
|
|
157
|
+
operator: "=",
|
|
158
|
+
value: parseGremlinLiteral(rawValue)
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
/** Parses a comma-separated argument list. */
|
|
162
|
+
const parseGremlinArgs = (args) => {
|
|
163
|
+
const result = [];
|
|
164
|
+
let depth = 0;
|
|
165
|
+
let current = "";
|
|
166
|
+
for (const ch of args) {
|
|
167
|
+
if (ch === "(") depth++;
|
|
168
|
+
else if (ch === ")") depth--;
|
|
169
|
+
if (ch === "," && depth === 0) {
|
|
170
|
+
result.push(parseGremlinLiteral(current.trim()));
|
|
171
|
+
current = "";
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
current += ch;
|
|
175
|
+
}
|
|
176
|
+
if (current.trim()) result.push(parseGremlinLiteral(current.trim()));
|
|
177
|
+
return result;
|
|
178
|
+
};
|
|
179
|
+
/** Parses a Gremlin literal value. */
|
|
180
|
+
const parseGremlinLiteral = (raw) => {
|
|
181
|
+
if (raw.startsWith("'") && raw.endsWith("'")) return raw.slice(1, -1).replace(/\\'/g, "'");
|
|
182
|
+
if (raw === "null") return null;
|
|
183
|
+
if (raw === "true") return true;
|
|
184
|
+
if (raw === "false") return false;
|
|
185
|
+
const num = Number(raw);
|
|
186
|
+
if (!Number.isNaN(num)) return num;
|
|
187
|
+
return raw;
|
|
188
|
+
};
|
|
189
|
+
//#endregion
|
|
190
|
+
exports.parseGremlin = parseGremlin;
|
|
191
|
+
|
|
192
|
+
//# sourceMappingURL=parseGremlin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseGremlin.js","names":[],"sources":["../src/utils/parseGremlin/parseGremlin.ts"],"sourcesContent":["import type {\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n} from '../../types';\n\n/**\n * Options for {@link parseGremlin}.\n */\nexport interface ParseGremlinOptions {\n independentCombinators?: boolean;\n}\n\n/**\n * Parses a Gremlin traversal string into a {@link DefaultRuleGroupType}.\n *\n * Accepts a full Gremlin traversal or a chain of `.has()` steps.\n * Pattern steps (`.hasLabel()`, `.out()`, `.in()`, `.both()`, `.as()`) are\n * consumed but discarded — only `.has()` filter predicates are returned.\n *\n * @example\n * ```ts\n * // Full traversal — extracts .has() conditions only\n * parseGremlin(\"g.V().hasLabel('Person').has('age', gt(30))\");\n *\n * // Bare .has() chain\n * parseGremlin(\".has('age', gt(30)).has('name', 'Alice')\");\n * ```\n */\nexport function parseGremlin(gremlin: string): DefaultRuleGroupType;\nexport function parseGremlin(\n gremlin: string,\n options: Omit<ParseGremlinOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseGremlin(\n gremlin: string,\n options: Omit<ParseGremlinOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseGremlin(\n gremlin: string,\n _options?: ParseGremlinOptions\n): DefaultRuleGroupTypeAny {\n const trimmed = gremlin.trim();\n if (!trimmed) return { combinator: 'and', rules: [] };\n\n const rules: (DefaultRuleType | DefaultRuleGroupType)[] = [];\n const steps = tokenizeGremlinSteps(trimmed);\n\n for (const step of steps) {\n // Skip pattern steps — only extract filter predicates\n // .hasLabel('Label') — pattern step, skip\n if (step.startsWith('hasLabel(')) continue;\n // .as('alias') — pattern step, skip\n if (step.startsWith('as(')) continue;\n // .out('edge'), .in('edge'), .both('edge') — pattern step, skip\n if (/^(out|in|both)\\(/.test(step)) continue;\n // .V(), .E() — traversal source, skip\n if (/^[VE]\\(/.test(step)) continue;\n\n // .hasNot('prop') — null check\n const hasNotMatch = step.match(/^hasNot\\('([^']+)'\\)$/);\n if (hasNotMatch) {\n rules.push({ field: hasNotMatch[1], operator: 'null', value: null } as DefaultRuleType);\n continue;\n }\n\n // .has('prop') — property exists\n const hasExistsMatch = step.match(/^has\\('([^']+)'\\)$/);\n if (hasExistsMatch) {\n rules.push({ field: hasExistsMatch[1], operator: 'notNull', value: null } as DefaultRuleType);\n continue;\n }\n\n // .has('prop', value) — equality or predicate\n const hasEqMatch = step.match(/^has\\('([^']+)',\\s*(.+)\\)$/);\n if (hasEqMatch) {\n const [, prop, rawValue] = hasEqMatch;\n const parsed = parseGremlinPredicate(prop, rawValue.trim());\n if (parsed) {\n rules.push(parsed);\n }\n continue;\n }\n }\n\n return { combinator: 'and', rules };\n}\n\n/** Tokenizes a Gremlin traversal string into individual step strings. */\nconst tokenizeGremlinSteps = (gremlin: string): string[] => {\n const steps: string[] = [];\n\n // Remove leading source (e.g., \"g.V().\")\n let str = gremlin.trim();\n const sourceMatch = str.match(/^\\w+\\.V\\(\\)\\./);\n if (sourceMatch) {\n str = str.slice(sourceMatch[0].length);\n } else if (str.startsWith('.')) {\n // Bare step chain starting with a dot\n str = str.slice(1);\n }\n\n // Split on top-level dots\n let depth = 0;\n let current = '';\n\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n\n if (ch === '.' && depth === 0) {\n if (current.trim()) steps.push(current.trim());\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.trim()) steps.push(current.trim());\n\n return steps;\n};\n\n/** Parses a Gremlin predicate (the second argument of `.has()`). */\nconst parseGremlinPredicate = (prop: string, rawValue: string): DefaultRuleType | null => {\n // Predicate functions: gt(), lt(), gte(), lte(), neq(), within(), without(), between(), outside()\n const predicateMatch = rawValue.match(/^(\\w+)\\((.+)\\)$/);\n if (predicateMatch) {\n const [, predName, args] = predicateMatch;\n const parsedArgs = parseGremlinArgs(args);\n\n switch (predName) {\n case 'gt':\n return { field: prop, operator: '>', value: parsedArgs[0] } as DefaultRuleType;\n case 'lt':\n return { field: prop, operator: '<', value: parsedArgs[0] } as DefaultRuleType;\n case 'gte':\n return { field: prop, operator: '>=', value: parsedArgs[0] } as DefaultRuleType;\n case 'lte':\n return { field: prop, operator: '<=', value: parsedArgs[0] } as DefaultRuleType;\n case 'neq':\n return { field: prop, operator: '!=', value: parsedArgs[0] } as DefaultRuleType;\n case 'within':\n return { field: prop, operator: 'in', value: parsedArgs } as DefaultRuleType;\n case 'without':\n return { field: prop, operator: 'notIn', value: parsedArgs } as DefaultRuleType;\n case 'between':\n return {\n field: prop,\n operator: 'between',\n value: parsedArgs.slice(0, 2),\n } as DefaultRuleType;\n case 'outside':\n return {\n field: prop,\n operator: 'notBetween',\n value: parsedArgs.slice(0, 2),\n } as DefaultRuleType;\n case 'containing':\n return { field: prop, operator: 'contains', value: parsedArgs[0] } as DefaultRuleType;\n case 'notContaining':\n return { field: prop, operator: 'doesNotContain', value: parsedArgs[0] } as DefaultRuleType;\n case 'startingWith':\n return { field: prop, operator: 'beginsWith', value: parsedArgs[0] } as DefaultRuleType;\n case 'notStartingWith':\n return {\n field: prop,\n operator: 'doesNotBeginWith',\n value: parsedArgs[0],\n } as DefaultRuleType;\n case 'endingWith':\n return { field: prop, operator: 'endsWith', value: parsedArgs[0] } as DefaultRuleType;\n case 'notEndingWith':\n return { field: prop, operator: 'doesNotEndWith', value: parsedArgs[0] } as DefaultRuleType;\n default:\n return null;\n }\n }\n\n // Plain value — equality\n return { field: prop, operator: '=', value: parseGremlinLiteral(rawValue) } as DefaultRuleType;\n};\n\n/** Parses a comma-separated argument list. */\nconst parseGremlinArgs = (args: string): unknown[] => {\n const result: unknown[] = [];\n let depth = 0;\n let current = '';\n\n for (const ch of args) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n result.push(parseGremlinLiteral(current.trim()));\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.trim()) result.push(parseGremlinLiteral(current.trim()));\n return result;\n};\n\n/** Parses a Gremlin literal value. */\nconst parseGremlinLiteral = (raw: string): unknown => {\n if (raw.startsWith(\"'\") && raw.endsWith(\"'\")) {\n return raw.slice(1, -1).replace(/\\\\'/g, \"'\");\n }\n if (raw === 'null') return null;\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n const num = Number(raw);\n if (!Number.isNaN(num)) return num;\n return raw;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
//#region src/utils/parseGremlin/parseGremlin.ts
|
|
2
|
+
function parseGremlin(gremlin, _options) {
|
|
3
|
+
const trimmed = gremlin.trim();
|
|
4
|
+
if (!trimmed) return {
|
|
5
|
+
combinator: "and",
|
|
6
|
+
rules: []
|
|
7
|
+
};
|
|
8
|
+
const rules = [];
|
|
9
|
+
const steps = tokenizeGremlinSteps(trimmed);
|
|
10
|
+
for (const step of steps) {
|
|
11
|
+
if (step.startsWith("hasLabel(")) continue;
|
|
12
|
+
if (step.startsWith("as(")) continue;
|
|
13
|
+
if (/^(out|in|both)\(/.test(step)) continue;
|
|
14
|
+
if (/^[VE]\(/.test(step)) continue;
|
|
15
|
+
const hasNotMatch = step.match(/^hasNot\('([^']+)'\)$/);
|
|
16
|
+
if (hasNotMatch) {
|
|
17
|
+
rules.push({
|
|
18
|
+
field: hasNotMatch[1],
|
|
19
|
+
operator: "null",
|
|
20
|
+
value: null
|
|
21
|
+
});
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const hasExistsMatch = step.match(/^has\('([^']+)'\)$/);
|
|
25
|
+
if (hasExistsMatch) {
|
|
26
|
+
rules.push({
|
|
27
|
+
field: hasExistsMatch[1],
|
|
28
|
+
operator: "notNull",
|
|
29
|
+
value: null
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const hasEqMatch = step.match(/^has\('([^']+)',\s*(.+)\)$/);
|
|
34
|
+
if (hasEqMatch) {
|
|
35
|
+
const [, prop, rawValue] = hasEqMatch;
|
|
36
|
+
const parsed = parseGremlinPredicate(prop, rawValue.trim());
|
|
37
|
+
if (parsed) rules.push(parsed);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
combinator: "and",
|
|
43
|
+
rules
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Tokenizes a Gremlin traversal string into individual step strings. */
|
|
47
|
+
const tokenizeGremlinSteps = (gremlin) => {
|
|
48
|
+
const steps = [];
|
|
49
|
+
let str = gremlin.trim();
|
|
50
|
+
const sourceMatch = str.match(/^\w+\.V\(\)\./);
|
|
51
|
+
if (sourceMatch) str = str.slice(sourceMatch[0].length);
|
|
52
|
+
else if (str.startsWith(".")) str = str.slice(1);
|
|
53
|
+
let depth = 0;
|
|
54
|
+
let current = "";
|
|
55
|
+
for (let i = 0; i < str.length; i++) {
|
|
56
|
+
const ch = str[i];
|
|
57
|
+
if (ch === "(") depth++;
|
|
58
|
+
else if (ch === ")") depth--;
|
|
59
|
+
if (ch === "." && depth === 0) {
|
|
60
|
+
if (current.trim()) steps.push(current.trim());
|
|
61
|
+
current = "";
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
current += ch;
|
|
65
|
+
}
|
|
66
|
+
if (current.trim()) steps.push(current.trim());
|
|
67
|
+
return steps;
|
|
68
|
+
};
|
|
69
|
+
/** Parses a Gremlin predicate (the second argument of `.has()`). */
|
|
70
|
+
const parseGremlinPredicate = (prop, rawValue) => {
|
|
71
|
+
const predicateMatch = rawValue.match(/^(\w+)\((.+)\)$/);
|
|
72
|
+
if (predicateMatch) {
|
|
73
|
+
const [, predName, args] = predicateMatch;
|
|
74
|
+
const parsedArgs = parseGremlinArgs(args);
|
|
75
|
+
switch (predName) {
|
|
76
|
+
case "gt": return {
|
|
77
|
+
field: prop,
|
|
78
|
+
operator: ">",
|
|
79
|
+
value: parsedArgs[0]
|
|
80
|
+
};
|
|
81
|
+
case "lt": return {
|
|
82
|
+
field: prop,
|
|
83
|
+
operator: "<",
|
|
84
|
+
value: parsedArgs[0]
|
|
85
|
+
};
|
|
86
|
+
case "gte": return {
|
|
87
|
+
field: prop,
|
|
88
|
+
operator: ">=",
|
|
89
|
+
value: parsedArgs[0]
|
|
90
|
+
};
|
|
91
|
+
case "lte": return {
|
|
92
|
+
field: prop,
|
|
93
|
+
operator: "<=",
|
|
94
|
+
value: parsedArgs[0]
|
|
95
|
+
};
|
|
96
|
+
case "neq": return {
|
|
97
|
+
field: prop,
|
|
98
|
+
operator: "!=",
|
|
99
|
+
value: parsedArgs[0]
|
|
100
|
+
};
|
|
101
|
+
case "within": return {
|
|
102
|
+
field: prop,
|
|
103
|
+
operator: "in",
|
|
104
|
+
value: parsedArgs
|
|
105
|
+
};
|
|
106
|
+
case "without": return {
|
|
107
|
+
field: prop,
|
|
108
|
+
operator: "notIn",
|
|
109
|
+
value: parsedArgs
|
|
110
|
+
};
|
|
111
|
+
case "between": return {
|
|
112
|
+
field: prop,
|
|
113
|
+
operator: "between",
|
|
114
|
+
value: parsedArgs.slice(0, 2)
|
|
115
|
+
};
|
|
116
|
+
case "outside": return {
|
|
117
|
+
field: prop,
|
|
118
|
+
operator: "notBetween",
|
|
119
|
+
value: parsedArgs.slice(0, 2)
|
|
120
|
+
};
|
|
121
|
+
case "containing": return {
|
|
122
|
+
field: prop,
|
|
123
|
+
operator: "contains",
|
|
124
|
+
value: parsedArgs[0]
|
|
125
|
+
};
|
|
126
|
+
case "notContaining": return {
|
|
127
|
+
field: prop,
|
|
128
|
+
operator: "doesNotContain",
|
|
129
|
+
value: parsedArgs[0]
|
|
130
|
+
};
|
|
131
|
+
case "startingWith": return {
|
|
132
|
+
field: prop,
|
|
133
|
+
operator: "beginsWith",
|
|
134
|
+
value: parsedArgs[0]
|
|
135
|
+
};
|
|
136
|
+
case "notStartingWith": return {
|
|
137
|
+
field: prop,
|
|
138
|
+
operator: "doesNotBeginWith",
|
|
139
|
+
value: parsedArgs[0]
|
|
140
|
+
};
|
|
141
|
+
case "endingWith": return {
|
|
142
|
+
field: prop,
|
|
143
|
+
operator: "endsWith",
|
|
144
|
+
value: parsedArgs[0]
|
|
145
|
+
};
|
|
146
|
+
case "notEndingWith": return {
|
|
147
|
+
field: prop,
|
|
148
|
+
operator: "doesNotEndWith",
|
|
149
|
+
value: parsedArgs[0]
|
|
150
|
+
};
|
|
151
|
+
default: return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
field: prop,
|
|
156
|
+
operator: "=",
|
|
157
|
+
value: parseGremlinLiteral(rawValue)
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
/** Parses a comma-separated argument list. */
|
|
161
|
+
const parseGremlinArgs = (args) => {
|
|
162
|
+
const result = [];
|
|
163
|
+
let depth = 0;
|
|
164
|
+
let current = "";
|
|
165
|
+
for (const ch of args) {
|
|
166
|
+
if (ch === "(") depth++;
|
|
167
|
+
else if (ch === ")") depth--;
|
|
168
|
+
if (ch === "," && depth === 0) {
|
|
169
|
+
result.push(parseGremlinLiteral(current.trim()));
|
|
170
|
+
current = "";
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
current += ch;
|
|
174
|
+
}
|
|
175
|
+
if (current.trim()) result.push(parseGremlinLiteral(current.trim()));
|
|
176
|
+
return result;
|
|
177
|
+
};
|
|
178
|
+
/** Parses a Gremlin literal value. */
|
|
179
|
+
const parseGremlinLiteral = (raw) => {
|
|
180
|
+
if (raw.startsWith("'") && raw.endsWith("'")) return raw.slice(1, -1).replace(/\\'/g, "'");
|
|
181
|
+
if (raw === "null") return null;
|
|
182
|
+
if (raw === "true") return true;
|
|
183
|
+
if (raw === "false") return false;
|
|
184
|
+
const num = Number(raw);
|
|
185
|
+
if (!Number.isNaN(num)) return num;
|
|
186
|
+
return raw;
|
|
187
|
+
};
|
|
188
|
+
//#endregion
|
|
189
|
+
export { parseGremlin };
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=parseGremlin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseGremlin.mjs","names":[],"sources":["../src/utils/parseGremlin/parseGremlin.ts"],"sourcesContent":["import type {\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n} from '../../types';\n\n/**\n * Options for {@link parseGremlin}.\n */\nexport interface ParseGremlinOptions {\n independentCombinators?: boolean;\n}\n\n/**\n * Parses a Gremlin traversal string into a {@link DefaultRuleGroupType}.\n *\n * Accepts a full Gremlin traversal or a chain of `.has()` steps.\n * Pattern steps (`.hasLabel()`, `.out()`, `.in()`, `.both()`, `.as()`) are\n * consumed but discarded — only `.has()` filter predicates are returned.\n *\n * @example\n * ```ts\n * // Full traversal — extracts .has() conditions only\n * parseGremlin(\"g.V().hasLabel('Person').has('age', gt(30))\");\n *\n * // Bare .has() chain\n * parseGremlin(\".has('age', gt(30)).has('name', 'Alice')\");\n * ```\n */\nexport function parseGremlin(gremlin: string): DefaultRuleGroupType;\nexport function parseGremlin(\n gremlin: string,\n options: Omit<ParseGremlinOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\nexport function parseGremlin(\n gremlin: string,\n options: Omit<ParseGremlinOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nexport function parseGremlin(\n gremlin: string,\n _options?: ParseGremlinOptions\n): DefaultRuleGroupTypeAny {\n const trimmed = gremlin.trim();\n if (!trimmed) return { combinator: 'and', rules: [] };\n\n const rules: (DefaultRuleType | DefaultRuleGroupType)[] = [];\n const steps = tokenizeGremlinSteps(trimmed);\n\n for (const step of steps) {\n // Skip pattern steps — only extract filter predicates\n // .hasLabel('Label') — pattern step, skip\n if (step.startsWith('hasLabel(')) continue;\n // .as('alias') — pattern step, skip\n if (step.startsWith('as(')) continue;\n // .out('edge'), .in('edge'), .both('edge') — pattern step, skip\n if (/^(out|in|both)\\(/.test(step)) continue;\n // .V(), .E() — traversal source, skip\n if (/^[VE]\\(/.test(step)) continue;\n\n // .hasNot('prop') — null check\n const hasNotMatch = step.match(/^hasNot\\('([^']+)'\\)$/);\n if (hasNotMatch) {\n rules.push({ field: hasNotMatch[1], operator: 'null', value: null } as DefaultRuleType);\n continue;\n }\n\n // .has('prop') — property exists\n const hasExistsMatch = step.match(/^has\\('([^']+)'\\)$/);\n if (hasExistsMatch) {\n rules.push({ field: hasExistsMatch[1], operator: 'notNull', value: null } as DefaultRuleType);\n continue;\n }\n\n // .has('prop', value) — equality or predicate\n const hasEqMatch = step.match(/^has\\('([^']+)',\\s*(.+)\\)$/);\n if (hasEqMatch) {\n const [, prop, rawValue] = hasEqMatch;\n const parsed = parseGremlinPredicate(prop, rawValue.trim());\n if (parsed) {\n rules.push(parsed);\n }\n continue;\n }\n }\n\n return { combinator: 'and', rules };\n}\n\n/** Tokenizes a Gremlin traversal string into individual step strings. */\nconst tokenizeGremlinSteps = (gremlin: string): string[] => {\n const steps: string[] = [];\n\n // Remove leading source (e.g., \"g.V().\")\n let str = gremlin.trim();\n const sourceMatch = str.match(/^\\w+\\.V\\(\\)\\./);\n if (sourceMatch) {\n str = str.slice(sourceMatch[0].length);\n } else if (str.startsWith('.')) {\n // Bare step chain starting with a dot\n str = str.slice(1);\n }\n\n // Split on top-level dots\n let depth = 0;\n let current = '';\n\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n\n if (ch === '.' && depth === 0) {\n if (current.trim()) steps.push(current.trim());\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.trim()) steps.push(current.trim());\n\n return steps;\n};\n\n/** Parses a Gremlin predicate (the second argument of `.has()`). */\nconst parseGremlinPredicate = (prop: string, rawValue: string): DefaultRuleType | null => {\n // Predicate functions: gt(), lt(), gte(), lte(), neq(), within(), without(), between(), outside()\n const predicateMatch = rawValue.match(/^(\\w+)\\((.+)\\)$/);\n if (predicateMatch) {\n const [, predName, args] = predicateMatch;\n const parsedArgs = parseGremlinArgs(args);\n\n switch (predName) {\n case 'gt':\n return { field: prop, operator: '>', value: parsedArgs[0] } as DefaultRuleType;\n case 'lt':\n return { field: prop, operator: '<', value: parsedArgs[0] } as DefaultRuleType;\n case 'gte':\n return { field: prop, operator: '>=', value: parsedArgs[0] } as DefaultRuleType;\n case 'lte':\n return { field: prop, operator: '<=', value: parsedArgs[0] } as DefaultRuleType;\n case 'neq':\n return { field: prop, operator: '!=', value: parsedArgs[0] } as DefaultRuleType;\n case 'within':\n return { field: prop, operator: 'in', value: parsedArgs } as DefaultRuleType;\n case 'without':\n return { field: prop, operator: 'notIn', value: parsedArgs } as DefaultRuleType;\n case 'between':\n return {\n field: prop,\n operator: 'between',\n value: parsedArgs.slice(0, 2),\n } as DefaultRuleType;\n case 'outside':\n return {\n field: prop,\n operator: 'notBetween',\n value: parsedArgs.slice(0, 2),\n } as DefaultRuleType;\n case 'containing':\n return { field: prop, operator: 'contains', value: parsedArgs[0] } as DefaultRuleType;\n case 'notContaining':\n return { field: prop, operator: 'doesNotContain', value: parsedArgs[0] } as DefaultRuleType;\n case 'startingWith':\n return { field: prop, operator: 'beginsWith', value: parsedArgs[0] } as DefaultRuleType;\n case 'notStartingWith':\n return {\n field: prop,\n operator: 'doesNotBeginWith',\n value: parsedArgs[0],\n } as DefaultRuleType;\n case 'endingWith':\n return { field: prop, operator: 'endsWith', value: parsedArgs[0] } as DefaultRuleType;\n case 'notEndingWith':\n return { field: prop, operator: 'doesNotEndWith', value: parsedArgs[0] } as DefaultRuleType;\n default:\n return null;\n }\n }\n\n // Plain value — equality\n return { field: prop, operator: '=', value: parseGremlinLiteral(rawValue) } as DefaultRuleType;\n};\n\n/** Parses a comma-separated argument list. */\nconst parseGremlinArgs = (args: string): unknown[] => {\n const result: unknown[] = [];\n let depth = 0;\n let current = '';\n\n for (const ch of args) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n result.push(parseGremlinLiteral(current.trim()));\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.trim()) result.push(parseGremlinLiteral(current.trim()));\n return result;\n};\n\n/** Parses a Gremlin literal value. */\nconst parseGremlinLiteral = (raw: string): unknown => {\n if (raw.startsWith(\"'\") && raw.endsWith(\"'\")) {\n return raw.slice(1, -1).replace(/\\\\'/g, \"'\");\n }\n if (raw === 'null') return null;\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n const num = Number(raw);\n if (!Number.isNaN(num)) return num;\n return raw;\n};\n"],"mappings":"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"}
|
package/dist/parseJSONata.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-AAZg4Uh1.mjs";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-BC_bAKQ8.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJSONata/parseJSONata.d.ts
|
|
5
5
|
/**
|
package/dist/parseJSONata.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
1
|
+
import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-Ds06V0zO.js";
|
|
2
|
+
import { t as ParserCommonOptions } from "./import-D1KnXhkQ.js";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/parseJSONata/parseJSONata.d.ts
|
|
5
5
|
/**
|
package/dist/parseJSONata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseJSONata.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","prepareRuleGroup"],"sources":["../src/utils/parseJSONata/utils.ts","../src/utils/parseJSONata/parseJSONata.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n JSONataAnd,\n JSONataBinaryNode,\n JSONataBlock,\n JSONataBoolean,\n JSONataContains,\n JSONataEqual,\n JSONataExprNode,\n JSONataGreaterThan,\n JSONataGreaterThanOrEqual,\n JSONataIdentifier,\n JSONataIn,\n JSONataLessThan,\n JSONataLessThanOrEqual,\n JSONataList,\n JSONataName,\n JSONataNot,\n JSONataNotEqual,\n JSONataNull,\n JSONataNumber,\n JSONataOr,\n JSONataPath,\n JSONataRegex,\n JSONataString,\n JSONataToMillis,\n} from './types';\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype Any = any;\n\nexport const isJSONataExprNode = (expr: Any): expr is JSONataExprNode => {\n return expr && typeof expr === 'object' && typeof expr.type === 'string';\n};\nconst isJSONataBinaryNode = (expr: Any): expr is JSONataBinaryNode =>\n isJSONataExprNode(expr) && expr.type === 'binary';\n\n// Identifiers\nexport const isJSONataPath = (expr: Any): expr is JSONataPath =>\n isJSONataExprNode(expr) &&\n expr.type === 'path' &&\n Array.isArray(expr.steps) &&\n expr.steps.length > 0 &&\n isJSONataExprNode(expr.steps[0]);\nexport const isJSONataName = (expr: Any): expr is JSONataName =>\n isJSONataExprNode(expr) &&\n expr.type === 'name' &&\n typeof expr.value === 'string' &&\n expr.value.length > 0;\nexport const isJSONataIdentifier = (expr: Any): expr is JSONataIdentifier =>\n isJSONataPath(expr) && expr.steps.every(v => isJSONataName(v));\n\n// Groups\nexport const isJSONataBlock = (expr: Any): expr is JSONataBlock =>\n isJSONataExprNode(expr) &&\n expr.type === 'block' &&\n Array.isArray(expr.expressions) &&\n expr.expressions.length > 0 &&\n isJSONataExprNode(expr.expressions[0]);\n\n// Values\nexport const isJSONataString = (expr: Any): expr is JSONataString =>\n isJSONataExprNode(expr) && expr.type === 'string' && typeof expr.value === 'string';\nexport const isJSONataNumber = (expr: Any): expr is JSONataNumber =>\n isJSONataExprNode(expr) && expr.type === 'number' && typeof expr.value === 'number';\nexport const isJSONataBoolean = (expr: Any): expr is JSONataBoolean =>\n isJSONataExprNode(expr) && expr.type === 'value' && typeof expr.value === 'boolean';\nexport const isJSONataNull = (expr: Any): expr is JSONataNull =>\n isJSONataExprNode(expr) && expr.type === 'value' && expr.value === null;\nexport const isJSONataRegex = (expr: Any): expr is JSONataRegex =>\n isJSONataExprNode(expr) && expr.type === 'regex' && expr.value instanceof RegExp;\n\n// Combinators\nexport const isJSONataAnd = (expr: Any): expr is JSONataAnd =>\n isJSONataBinaryNode(expr) && expr.value === 'and';\nexport const isJSONataOr = (expr: Any): expr is JSONataOr =>\n isJSONataBinaryNode(expr) && expr.value === 'or';\n\n// Operators\nexport const isJSONataEqual = (expr: Any): expr is JSONataEqual =>\n isJSONataBinaryNode(expr) && expr.value === '=';\nexport const isJSONataNotEqual = (expr: Any): expr is JSONataNotEqual =>\n isJSONataBinaryNode(expr) && expr.value === '!=';\nexport const isJSONataGreaterThan = (expr: Any): expr is JSONataGreaterThan =>\n isJSONataBinaryNode(expr) && expr.value === '>';\nexport const isJSONataGreaterThanOrEqual = (expr: Any): expr is JSONataGreaterThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '>=';\nexport const isJSONataLessThan = (expr: Any): expr is JSONataLessThan =>\n isJSONataBinaryNode(expr) && expr.value === '<';\nexport const isJSONataLessThanOrEqual = (expr: Any): expr is JSONataLessThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '<=';\nexport const isJSONataIn = (expr: Any): expr is JSONataIn =>\n isJSONataBinaryNode(expr) &&\n expr.value === 'in' &&\n isJSONataPath(expr.lhs) &&\n isJSONataList(expr.rhs);\n\n// Functions\nexport const isJSONataNot = (expr: Any): expr is JSONataNot =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'not' &&\n expr.procedure.type === 'variable';\nexport const isJSONataContains = (expr: Any): expr is JSONataContains =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length >= 2 &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'contains' &&\n expr.procedure.type === 'variable';\nexport const isJSONataToMillis = (expr: Any): expr is JSONataToMillis =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length > 0 &&\n isJSONataString(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'toMillis' &&\n expr.procedure.type === 'variable';\n\n// Miscellaneous\nexport const isJSONataList = (expr: Any): expr is JSONataList =>\n isJSONataExprNode(expr) &&\n expr.type === 'unary' &&\n expr.value === '[' &&\n Array.isArray(expr.expressions);\nexport const isJSONataPrimitive = (expr: Any): boolean => {\n return (\n isJSONataString(expr) ||\n isJSONataNumber(expr) ||\n isJSONataBoolean(expr) ||\n isJSONataNull(expr) ||\n isJSONataToMillis(expr)\n );\n};\nexport const isJSONataPrimitiveList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataPrimitive(v));\nexport const isJSONataIdentifierList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataIdentifier(v));\nexport const isJSONataValidValue = (expr: Any): boolean =>\n isJSONataPrimitive(expr) ||\n isJSONataRegex(expr) ||\n isJSONataIdentifier(expr) ||\n isJSONataPrimitiveList(expr) ||\n isJSONataIdentifierList(expr) ||\n isJSONataToMillis(expr);\nexport const isJSONataComparison = (\n expr: Any\n): expr is\n | JSONataEqual\n | JSONataNotEqual\n | JSONataGreaterThan\n | JSONataGreaterThanOrEqual\n | JSONataLessThan\n | JSONataLessThanOrEqual =>\n isJSONataEqual(expr) ||\n isJSONataNotEqual(expr) ||\n isJSONataGreaterThan(expr) ||\n isJSONataGreaterThanOrEqual(expr) ||\n isJSONataLessThan(expr) ||\n isJSONataLessThanOrEqual(expr);\n\nexport const getValidValue = (expr: Any): Any => {\n if (isJSONataToMillis(expr)) {\n return getValidValue(expr.arguments[0]);\n } else if (isJSONataIdentifier(expr)) {\n return getFieldFromPath(expr);\n } else if (isJSONataPrimitiveList(expr)) {\n return expr.expressions.map((v: Any) => getValidValue(v));\n } else if (isJSONataIdentifierList(expr)) {\n return expr.expressions.map((v: Any) => getFieldFromPath(v));\n }\n return expr.value;\n};\n\nexport const getFieldFromPath = (path: JSONataPath): string =>\n isJSONataIdentifier(path)\n ? path.steps.map(s => s.value).join('.')\n : /* v8 ignore next -- @preserve */ '';\n\nexport const normalizeOperator = (\n opType: DefaultOperatorName,\n flip?: boolean\n): DefaultOperatorName => {\n if (flip) {\n if (opType === '<') return '>';\n if (opType === '<=') return '>=';\n if (opType === '>') return '<';\n if (opType === '>=') return '<=';\n }\n return opType;\n};\n\nexport const negatedLikeOperators: Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n> = {\n contains: 'doesNotContain',\n beginsWith: 'doesNotBeginWith',\n endsWith: 'doesNotEndWith',\n} satisfies Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n>;\n\nexport const generateFlatAndOrList = (\n expr: JSONataExprNode\n): (DefaultCombinatorName | JSONataExprNode)[] => {\n // v8 ignore else\n if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n const { lhs, rhs, value: combinator } = expr;\n if (isJSONataAnd(lhs) || isJSONataOr(lhs)) {\n return [...generateFlatAndOrList(lhs), combinator, rhs];\n }\n return [lhs, combinator, rhs];\n }\n // v8 ignore next\n return [];\n};\n\nexport const generateMixedAndOrList = (\n expr: JSONataAnd | JSONataOr\n): (JSONataExprNode | DefaultCombinatorName | (JSONataExprNode | 'and')[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (DefaultCombinatorName | JSONataExprNode | ('and' | JSONataExprNode)[])[] = [];\n let startIndex = 0;\n for (let i = 0; i < arr.length; i += 2) {\n if (arr[i + 1] === 'and') {\n startIndex = i;\n let j = 1;\n while (arr[startIndex + j] === 'and') {\n i += 2;\n j += 2;\n }\n const tempAndArray = arr.slice(startIndex, i + 1) as ('and' | JSONataExprNode)[];\n returnArray.push(tempAndArray);\n i -= 2;\n } else if (arr[i + 1] === 'or') {\n if (i === 0 || i === arr.length - 3) {\n if (i === 0 || arr[i - 1] === 'or') {\n returnArray.push(arr[i]);\n }\n returnArray.push(arr[i + 1]);\n if (i === arr.length - 3) {\n returnArray.push(arr[i + 2]);\n }\n } else {\n if (arr[i - 1] === 'and') {\n returnArray.push(arr[i + 1]);\n } else {\n returnArray.push(arr[i], arr[i + 1]);\n }\n }\n }\n }\n if (returnArray.length === 1 && Array.isArray(returnArray[0])) {\n // If length is 1, then the only element is an AND array so just return that\n return returnArray[0];\n }\n return returnArray;\n};\n","import jsonata from 'jsonata';\nimport type { Except } from 'type-fest';\nimport type {\n DefaultCombinatorName,\n DefaultOperatorName,\n DefaultRuleGroupArray,\n DefaultRuleGroupICArray,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { JSONataExprNode } from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n getFieldFromPath,\n getValidValue,\n isJSONataAnd,\n isJSONataBlock,\n isJSONataComparison,\n isJSONataContains,\n isJSONataIdentifier,\n isJSONataIdentifierList,\n isJSONataIn,\n isJSONataNot,\n isJSONataOr,\n isJSONataRegex,\n isJSONataString,\n isJSONataValidValue,\n negatedLikeOperators,\n normalizeOperator,\n} from './utils';\n\n/**\n * Options object for {@link parseJSONata}.\n *\n * Note: `listsAsArrays` is ignored by `parseJSONata`; lists are _always_ arrays.\n */\nexport interface ParseJSONataOptions extends ParserCommonOptions {}\n\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJSONata(jsonataInput: string): DefaultRuleGroupType;\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJSONata(\n jsonataInput: string,\n options: ParseJSONataOptions = {}\n): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays: _laa } = options;\n const ic = !!independentCombinators;\n const fieldsFlat = getFieldsArray(fields);\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources: options?.getValueSources,\n });\n\n const emptyQuery: DefaultRuleGroupTypeAny = {\n rules: [],\n ...(ic ? {} : { combinator: 'and' }),\n };\n\n const parseJSONataAST = (\n expr: JSONataExprNode,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (isJSONataBlock(expr)) {\n if (\n isJSONataAnd(expr.expressions[0]) ||\n isJSONataOr(expr.expressions[0]) ||\n isJSONataBlock(expr.expressions[0])\n ) {\n return parseJSONataAST(expr.expressions[0]);\n }\n const blockOfExpr = parseJSONataAST(expr.expressions[0]);\n // v8 ignore else\n if (blockOfExpr) {\n return ic\n ? ({ rules: [blockOfExpr] } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [blockOfExpr],\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n if (ic) {\n const andOrList = generateFlatAndOrList(expr);\n const rules = andOrList.map(v => {\n if (typeof v === 'string') {\n return v;\n }\n return parseJSONataAST(v);\n });\n // Bail out completely if any rules in the list were invalid\n // so as not to return an incorrect and/or sequence\n if (!rules.every(Boolean)) {\n return null;\n }\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultCombinatorName, DefaultRuleType] =>\n rs.length === 3 &&\n (rs[1] === 'and' || rs[1] === 'or') &&\n !isRuleGroup(rs[0]) &&\n !isRuleGroup(rs[2]))(rules) &&\n rules[0].field === rules[2].field &&\n (rules[0].valueSource ?? 'value') === (rules[2].valueSource ?? 'value') &&\n ((rules[1] === 'and' &&\n ((rules[0].operator === '>=' && rules[2].operator === '<=') ||\n (rules[0].operator === '<=' && rules[2].operator === '>='))) ||\n (rules[1] === 'or' &&\n ((rules[0].operator === '>' && rules[2].operator === '<') ||\n (rules[0].operator === '<' && rules[2].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: rules[1] === 'and' ? 'between' : 'notBetween',\n value:\n (rules[1] === 'and' && rules[0].operator === '<=') ||\n (rules[1] === 'or' && rules[0].operator === '>')\n ? [rules[2].value, rules[0].value]\n : [rules[0].value, rules[2].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n return {\n rules: rules as DefaultRuleGroupICArray,\n };\n }\n const andOrList = generateMixedAndOrList(expr);\n const combinator = andOrList[1] as DefaultCombinatorName;\n const filteredList = andOrList\n .filter(v => Array.isArray(v) || (!!v && typeof v !== 'string' && 'type' in v))\n .map(v =>\n Array.isArray(v) ? v.filter(vf => !!v && typeof vf !== 'string' && 'type' in vf) : v\n ) as (JSONataExprNode | JSONataExprNode[])[];\n const rules = filteredList\n .map((exp): DefaultRuleGroupType | DefaultRuleType | null => {\n if (Array.isArray(exp)) {\n return {\n combinator: 'and',\n rules: exp.map(e => parseJSONataAST(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseJSONataAST(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultRuleType] =>\n rs.length === 2 && !isRuleGroup(rs[0]) && !isRuleGroup(rs[1]))(rules) &&\n rules[0].field === rules[1].field &&\n (rules[0].valueSource ?? 'value') === (rules[1].valueSource ?? 'value') &&\n ((combinator === 'and' &&\n ((rules[0].operator === '>=' && rules[1].operator === '<=') ||\n (rules[0].operator === '<=' && rules[1].operator === '>='))) ||\n (combinator === 'or' &&\n ((rules[0].operator === '>' && rules[1].operator === '<') ||\n (rules[0].operator === '<' && rules[1].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: combinator === 'and' ? 'between' : 'notBetween',\n value:\n (combinator === 'and' && rules[0].operator === '<=') ||\n (combinator === 'or' && rules[0].operator === '>')\n ? [rules[1].value, rules[0].value]\n : [rules[0].value, rules[1].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isJSONataNot(expr)) {\n const negatedExpr = parseJSONataAST(expr.arguments[0]);\n // v8 ignore else\n if (negatedExpr) {\n if (\n !isRuleGroup(negatedExpr) &&\n (negatedExpr.operator === 'contains' ||\n negatedExpr.operator === 'beginsWith' ||\n negatedExpr.operator === 'endsWith')\n ) {\n return {\n ...negatedExpr,\n operator: negatedLikeOperators[negatedExpr.operator],\n };\n }\n return ic\n ? ({ rules: [negatedExpr], not: true } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [negatedExpr],\n not: true,\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataContains(expr)) {\n const [arg1, arg2] = expr.arguments;\n let field: string = '';\n let regex: string | RegExp = '';\n let valueSource: ValueSource | undefined = undefined;\n // v8 ignore else\n if (isJSONataIdentifier(arg1)) {\n field = getFieldFromPath(arg1);\n if (isJSONataIdentifier(arg2)) {\n regex = getFieldFromPath(arg2);\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isJSONataString(arg2) || isJSONataRegex(arg2)) {\n regex = getValidValue(arg2);\n }\n }\n }\n\n // v8 ignore else\n if (\n valueSource === 'field'\n ? fieldIsValid(field, 'contains', regex as string)\n : fieldIsValid(field, 'contains')\n ) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else if (isJSONataIn(expr)) {\n const field = getFieldFromPath(expr.lhs);\n let valueSource: ValueSource | undefined = undefined;\n if (isJSONataIdentifierList(expr.rhs)) {\n valueSource = 'field';\n }\n if (isJSONataValidValue(expr.rhs)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const value: any[] = getValidValue(expr.rhs);\n // v8 ignore else\n if (\n field &&\n value.every(v => fieldIsValid(field, 'in', valueSource === 'field' ? v : undefined))\n ) {\n return { field, operator: 'in', value, ...(valueSource ? { valueSource } : {}) };\n }\n }\n } else if (isJSONataComparison(expr)) {\n let field: string | null = null;\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = undefined;\n let valueSource: ValueSource | undefined = undefined;\n let flip = false;\n const { lhs, rhs } = expr;\n\n if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {\n field = getFieldFromPath(lhs);\n value = getValidValue(rhs);\n if (isJSONataIdentifier(rhs)) {\n valueSource = 'field';\n }\n } else {\n // v8 ignore else\n if (isJSONataIdentifier(rhs) && isJSONataValidValue(lhs)) {\n flip = true;\n field = getFieldFromPath(rhs);\n value = getValidValue(lhs);\n }\n }\n let operator = normalizeOperator(expr.value, flip);\n if (value === null && (operator === '=' || operator === '!=')) {\n operator = operator === '=' ? 'null' : 'notNull';\n }\n if (\n field &&\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined) &&\n value !== undefined\n ) {\n return valueSource ? { field, operator, value, valueSource } : { field, operator, value };\n }\n }\n return null;\n };\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let jsonataExpr: jsonata.Expression;\n try {\n jsonataExpr = jsonata(jsonataInput);\n } catch {\n return prepare(emptyQuery);\n }\n const jsonataAST = jsonataExpr.ast() as JSONataExprNode;\n\n const result = parseJSONataAST(jsonataAST);\n if (result) {\n if (isRuleGroup(result)) {\n return prepare(result);\n }\n return prepare({ rules: [result], ...(ic ? {} : { combinator: 'and' }) });\n }\n\n return prepare(emptyQuery);\n}\n\nexport { parseJSONata };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseJSONata.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","prepareRuleGroup"],"sources":["../src/utils/parseJSONata/utils.ts","../src/utils/parseJSONata/parseJSONata.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n JSONataAnd,\n JSONataBinaryNode,\n JSONataBlock,\n JSONataBoolean,\n JSONataContains,\n JSONataEqual,\n JSONataExprNode,\n JSONataGreaterThan,\n JSONataGreaterThanOrEqual,\n JSONataIdentifier,\n JSONataIn,\n JSONataLessThan,\n JSONataLessThanOrEqual,\n JSONataList,\n JSONataName,\n JSONataNot,\n JSONataNotEqual,\n JSONataNull,\n JSONataNumber,\n JSONataOr,\n JSONataPath,\n JSONataRegex,\n JSONataString,\n JSONataToMillis,\n} from './types';\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype Any = any;\n\nexport const isJSONataExprNode = (expr: Any): expr is JSONataExprNode => {\n return expr && typeof expr === 'object' && typeof expr.type === 'string';\n};\nconst isJSONataBinaryNode = (expr: Any): expr is JSONataBinaryNode =>\n isJSONataExprNode(expr) && expr.type === 'binary';\n\n// Identifiers\nexport const isJSONataPath = (expr: Any): expr is JSONataPath =>\n isJSONataExprNode(expr) &&\n expr.type === 'path' &&\n Array.isArray(expr.steps) &&\n expr.steps.length > 0 &&\n isJSONataExprNode(expr.steps[0]);\nexport const isJSONataName = (expr: Any): expr is JSONataName =>\n isJSONataExprNode(expr) &&\n expr.type === 'name' &&\n typeof expr.value === 'string' &&\n expr.value.length > 0;\nexport const isJSONataIdentifier = (expr: Any): expr is JSONataIdentifier =>\n isJSONataPath(expr) && expr.steps.every(v => isJSONataName(v));\n\n// Groups\nexport const isJSONataBlock = (expr: Any): expr is JSONataBlock =>\n isJSONataExprNode(expr) &&\n expr.type === 'block' &&\n Array.isArray(expr.expressions) &&\n expr.expressions.length > 0 &&\n isJSONataExprNode(expr.expressions[0]);\n\n// Values\nexport const isJSONataString = (expr: Any): expr is JSONataString =>\n isJSONataExprNode(expr) && expr.type === 'string' && typeof expr.value === 'string';\nexport const isJSONataNumber = (expr: Any): expr is JSONataNumber =>\n isJSONataExprNode(expr) && expr.type === 'number' && typeof expr.value === 'number';\nexport const isJSONataBoolean = (expr: Any): expr is JSONataBoolean =>\n isJSONataExprNode(expr) && expr.type === 'value' && typeof expr.value === 'boolean';\nexport const isJSONataNull = (expr: Any): expr is JSONataNull =>\n isJSONataExprNode(expr) && expr.type === 'value' && expr.value === null;\nexport const isJSONataRegex = (expr: Any): expr is JSONataRegex =>\n isJSONataExprNode(expr) && expr.type === 'regex' && expr.value instanceof RegExp;\n\n// Combinators\nexport const isJSONataAnd = (expr: Any): expr is JSONataAnd =>\n isJSONataBinaryNode(expr) && expr.value === 'and';\nexport const isJSONataOr = (expr: Any): expr is JSONataOr =>\n isJSONataBinaryNode(expr) && expr.value === 'or';\n\n// Operators\nexport const isJSONataEqual = (expr: Any): expr is JSONataEqual =>\n isJSONataBinaryNode(expr) && expr.value === '=';\nexport const isJSONataNotEqual = (expr: Any): expr is JSONataNotEqual =>\n isJSONataBinaryNode(expr) && expr.value === '!=';\nexport const isJSONataGreaterThan = (expr: Any): expr is JSONataGreaterThan =>\n isJSONataBinaryNode(expr) && expr.value === '>';\nexport const isJSONataGreaterThanOrEqual = (expr: Any): expr is JSONataGreaterThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '>=';\nexport const isJSONataLessThan = (expr: Any): expr is JSONataLessThan =>\n isJSONataBinaryNode(expr) && expr.value === '<';\nexport const isJSONataLessThanOrEqual = (expr: Any): expr is JSONataLessThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '<=';\nexport const isJSONataIn = (expr: Any): expr is JSONataIn =>\n isJSONataBinaryNode(expr) &&\n expr.value === 'in' &&\n isJSONataPath(expr.lhs) &&\n isJSONataList(expr.rhs);\n\n// Functions\nexport const isJSONataNot = (expr: Any): expr is JSONataNot =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'not' &&\n expr.procedure.type === 'variable';\nexport const isJSONataContains = (expr: Any): expr is JSONataContains =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length >= 2 &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'contains' &&\n expr.procedure.type === 'variable';\nexport const isJSONataToMillis = (expr: Any): expr is JSONataToMillis =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length > 0 &&\n isJSONataString(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'toMillis' &&\n expr.procedure.type === 'variable';\n\n// Miscellaneous\nexport const isJSONataList = (expr: Any): expr is JSONataList =>\n isJSONataExprNode(expr) &&\n expr.type === 'unary' &&\n expr.value === '[' &&\n Array.isArray(expr.expressions);\nexport const isJSONataPrimitive = (expr: Any): boolean => {\n return (\n isJSONataString(expr) ||\n isJSONataNumber(expr) ||\n isJSONataBoolean(expr) ||\n isJSONataNull(expr) ||\n isJSONataToMillis(expr)\n );\n};\nexport const isJSONataPrimitiveList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataPrimitive(v));\nexport const isJSONataIdentifierList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataIdentifier(v));\nexport const isJSONataValidValue = (expr: Any): boolean =>\n isJSONataPrimitive(expr) ||\n isJSONataRegex(expr) ||\n isJSONataIdentifier(expr) ||\n isJSONataPrimitiveList(expr) ||\n isJSONataIdentifierList(expr) ||\n isJSONataToMillis(expr);\nexport const isJSONataComparison = (\n expr: Any\n): expr is\n | JSONataEqual\n | JSONataNotEqual\n | JSONataGreaterThan\n | JSONataGreaterThanOrEqual\n | JSONataLessThan\n | JSONataLessThanOrEqual =>\n isJSONataEqual(expr) ||\n isJSONataNotEqual(expr) ||\n isJSONataGreaterThan(expr) ||\n isJSONataGreaterThanOrEqual(expr) ||\n isJSONataLessThan(expr) ||\n isJSONataLessThanOrEqual(expr);\n\nexport const getValidValue = (expr: Any): Any => {\n if (isJSONataToMillis(expr)) {\n return getValidValue(expr.arguments[0]);\n } else if (isJSONataIdentifier(expr)) {\n return getFieldFromPath(expr);\n } else if (isJSONataPrimitiveList(expr)) {\n return expr.expressions.map((v: Any) => getValidValue(v));\n } else if (isJSONataIdentifierList(expr)) {\n return expr.expressions.map((v: Any) => getFieldFromPath(v));\n }\n return expr.value;\n};\n\nexport const getFieldFromPath = (path: JSONataPath): string =>\n isJSONataIdentifier(path)\n ? path.steps.map(s => s.value).join('.')\n : /* v8 ignore next -- @preserve */ '';\n\nexport const normalizeOperator = (\n opType: DefaultOperatorName,\n flip?: boolean\n): DefaultOperatorName => {\n if (flip) {\n if (opType === '<') return '>';\n if (opType === '<=') return '>=';\n if (opType === '>') return '<';\n if (opType === '>=') return '<=';\n }\n return opType;\n};\n\nexport const negatedLikeOperators: Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n> = {\n contains: 'doesNotContain',\n beginsWith: 'doesNotBeginWith',\n endsWith: 'doesNotEndWith',\n} satisfies Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n>;\n\nexport const generateFlatAndOrList = (\n expr: JSONataExprNode\n): (DefaultCombinatorName | JSONataExprNode)[] => {\n // v8 ignore else\n if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n const { lhs, rhs, value: combinator } = expr;\n if (isJSONataAnd(lhs) || isJSONataOr(lhs)) {\n return [...generateFlatAndOrList(lhs), combinator, rhs];\n }\n return [lhs, combinator, rhs];\n }\n // v8 ignore next\n return [];\n};\n\nexport const generateMixedAndOrList = (\n expr: JSONataAnd | JSONataOr\n): (JSONataExprNode | DefaultCombinatorName | (JSONataExprNode | 'and')[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (DefaultCombinatorName | JSONataExprNode | ('and' | JSONataExprNode)[])[] = [];\n let startIndex = 0;\n for (let i = 0; i < arr.length; i += 2) {\n if (arr[i + 1] === 'and') {\n startIndex = i;\n let j = 1;\n while (arr[startIndex + j] === 'and') {\n i += 2;\n j += 2;\n }\n const tempAndArray = arr.slice(startIndex, i + 1) as ('and' | JSONataExprNode)[];\n returnArray.push(tempAndArray);\n i -= 2;\n } else if (arr[i + 1] === 'or') {\n if (i === 0 || i === arr.length - 3) {\n if (i === 0 || arr[i - 1] === 'or') {\n returnArray.push(arr[i]);\n }\n returnArray.push(arr[i + 1]);\n if (i === arr.length - 3) {\n returnArray.push(arr[i + 2]);\n }\n } else {\n if (arr[i - 1] === 'and') {\n returnArray.push(arr[i + 1]);\n } else {\n returnArray.push(arr[i], arr[i + 1]);\n }\n }\n }\n }\n if (returnArray.length === 1 && Array.isArray(returnArray[0])) {\n // If length is 1, then the only element is an AND array so just return that\n return returnArray[0];\n }\n return returnArray;\n};\n","import jsonata from 'jsonata';\nimport type { Except } from 'type-fest';\nimport type {\n DefaultCombinatorName,\n DefaultOperatorName,\n DefaultRuleGroupArray,\n DefaultRuleGroupICArray,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { JSONataExprNode } from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n getFieldFromPath,\n getValidValue,\n isJSONataAnd,\n isJSONataBlock,\n isJSONataComparison,\n isJSONataContains,\n isJSONataIdentifier,\n isJSONataIdentifierList,\n isJSONataIn,\n isJSONataNot,\n isJSONataOr,\n isJSONataRegex,\n isJSONataString,\n isJSONataValidValue,\n negatedLikeOperators,\n normalizeOperator,\n} from './utils';\n\n/**\n * Options object for {@link parseJSONata}.\n *\n * Note: `listsAsArrays` is ignored by `parseJSONata`; lists are _always_ arrays.\n */\nexport interface ParseJSONataOptions extends ParserCommonOptions {}\n\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJSONata(jsonataInput: string): DefaultRuleGroupType;\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JSONata string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJSONata(\n jsonataInput: string,\n options: ParseJSONataOptions = {}\n): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays: _laa } = options;\n const ic = !!independentCombinators;\n const fieldsFlat = getFieldsArray(fields);\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources: options?.getValueSources,\n });\n\n const emptyQuery: DefaultRuleGroupTypeAny = {\n rules: [],\n ...(ic ? {} : { combinator: 'and' }),\n };\n\n const parseJSONataAST = (\n expr: JSONataExprNode,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (isJSONataBlock(expr)) {\n if (\n isJSONataAnd(expr.expressions[0]) ||\n isJSONataOr(expr.expressions[0]) ||\n isJSONataBlock(expr.expressions[0])\n ) {\n return parseJSONataAST(expr.expressions[0]);\n }\n const blockOfExpr = parseJSONataAST(expr.expressions[0]);\n // v8 ignore else\n if (blockOfExpr) {\n return ic\n ? ({ rules: [blockOfExpr] } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [blockOfExpr],\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n if (ic) {\n const andOrList = generateFlatAndOrList(expr);\n const rules = andOrList.map(v => {\n if (typeof v === 'string') {\n return v;\n }\n return parseJSONataAST(v);\n });\n // Bail out completely if any rules in the list were invalid\n // so as not to return an incorrect and/or sequence\n if (!rules.every(Boolean)) {\n return null;\n }\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultCombinatorName, DefaultRuleType] =>\n rs.length === 3 &&\n (rs[1] === 'and' || rs[1] === 'or') &&\n !isRuleGroup(rs[0]) &&\n !isRuleGroup(rs[2]))(rules) &&\n rules[0].field === rules[2].field &&\n (rules[0].valueSource ?? 'value') === (rules[2].valueSource ?? 'value') &&\n ((rules[1] === 'and' &&\n ((rules[0].operator === '>=' && rules[2].operator === '<=') ||\n (rules[0].operator === '<=' && rules[2].operator === '>='))) ||\n (rules[1] === 'or' &&\n ((rules[0].operator === '>' && rules[2].operator === '<') ||\n (rules[0].operator === '<' && rules[2].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: rules[1] === 'and' ? 'between' : 'notBetween',\n value:\n (rules[1] === 'and' && rules[0].operator === '<=') ||\n (rules[1] === 'or' && rules[0].operator === '>')\n ? [rules[2].value, rules[0].value]\n : [rules[0].value, rules[2].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n return {\n rules: rules as DefaultRuleGroupICArray,\n };\n }\n const andOrList = generateMixedAndOrList(expr);\n const combinator = andOrList[1] as DefaultCombinatorName;\n const filteredList = andOrList\n .filter(v => Array.isArray(v) || (!!v && typeof v !== 'string' && 'type' in v))\n .map(v =>\n Array.isArray(v) ? v.filter(vf => !!v && typeof vf !== 'string' && 'type' in vf) : v\n ) as (JSONataExprNode | JSONataExprNode[])[];\n const rules = filteredList\n .map((exp): DefaultRuleGroupType | DefaultRuleType | null => {\n if (Array.isArray(exp)) {\n return {\n combinator: 'and',\n rules: exp.map(e => parseJSONataAST(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseJSONataAST(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultRuleType] =>\n rs.length === 2 && !isRuleGroup(rs[0]) && !isRuleGroup(rs[1]))(rules) &&\n rules[0].field === rules[1].field &&\n (rules[0].valueSource ?? 'value') === (rules[1].valueSource ?? 'value') &&\n ((combinator === 'and' &&\n ((rules[0].operator === '>=' && rules[1].operator === '<=') ||\n (rules[0].operator === '<=' && rules[1].operator === '>='))) ||\n (combinator === 'or' &&\n ((rules[0].operator === '>' && rules[1].operator === '<') ||\n (rules[0].operator === '<' && rules[1].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: combinator === 'and' ? 'between' : 'notBetween',\n value:\n (combinator === 'and' && rules[0].operator === '<=') ||\n (combinator === 'or' && rules[0].operator === '>')\n ? [rules[1].value, rules[0].value]\n : [rules[0].value, rules[1].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isJSONataNot(expr)) {\n const negatedExpr = parseJSONataAST(expr.arguments[0]);\n // v8 ignore else\n if (negatedExpr) {\n if (\n !isRuleGroup(negatedExpr) &&\n (negatedExpr.operator === 'contains' ||\n negatedExpr.operator === 'beginsWith' ||\n negatedExpr.operator === 'endsWith')\n ) {\n return {\n ...negatedExpr,\n operator: negatedLikeOperators[negatedExpr.operator],\n };\n }\n return ic\n ? ({ rules: [negatedExpr], not: true } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [negatedExpr],\n not: true,\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataContains(expr)) {\n const [arg1, arg2] = expr.arguments;\n let field: string = '';\n let regex: string | RegExp = '';\n let valueSource: ValueSource | undefined = undefined;\n // v8 ignore else\n if (isJSONataIdentifier(arg1)) {\n field = getFieldFromPath(arg1);\n if (isJSONataIdentifier(arg2)) {\n regex = getFieldFromPath(arg2);\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isJSONataString(arg2) || isJSONataRegex(arg2)) {\n regex = getValidValue(arg2);\n }\n }\n }\n\n // v8 ignore else\n if (\n valueSource === 'field'\n ? fieldIsValid(field, 'contains', regex as string)\n : fieldIsValid(field, 'contains')\n ) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else if (isJSONataIn(expr)) {\n const field = getFieldFromPath(expr.lhs);\n let valueSource: ValueSource | undefined = undefined;\n if (isJSONataIdentifierList(expr.rhs)) {\n valueSource = 'field';\n }\n if (isJSONataValidValue(expr.rhs)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const value: any[] = getValidValue(expr.rhs);\n // v8 ignore else\n if (\n field &&\n value.every(v => fieldIsValid(field, 'in', valueSource === 'field' ? v : undefined))\n ) {\n return { field, operator: 'in', value, ...(valueSource ? { valueSource } : {}) };\n }\n }\n } else if (isJSONataComparison(expr)) {\n let field: string | null = null;\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = undefined;\n let valueSource: ValueSource | undefined = undefined;\n let flip = false;\n const { lhs, rhs } = expr;\n\n if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {\n field = getFieldFromPath(lhs);\n value = getValidValue(rhs);\n if (isJSONataIdentifier(rhs)) {\n valueSource = 'field';\n }\n } else {\n // v8 ignore else\n if (isJSONataIdentifier(rhs) && isJSONataValidValue(lhs)) {\n flip = true;\n field = getFieldFromPath(rhs);\n value = getValidValue(lhs);\n }\n }\n let operator = normalizeOperator(expr.value, flip);\n if (value === null && (operator === '=' || operator === '!=')) {\n operator = operator === '=' ? 'null' : 'notNull';\n }\n if (\n field &&\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined) &&\n value !== undefined\n ) {\n return valueSource ? { field, operator, value, valueSource } : { field, operator, value };\n }\n }\n return null;\n };\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let jsonataExpr: jsonata.Expression;\n try {\n jsonataExpr = jsonata(jsonataInput);\n } catch {\n return prepare(emptyQuery);\n }\n const jsonataAST = jsonataExpr.ast() as JSONataExprNode;\n\n const result = parseJSONataAST(jsonataAST);\n if (result) {\n if (isRuleGroup(result)) {\n return prepare(result);\n }\n return prepare({ rules: [result], ...(ic ? {} : { combinator: 'and' }) });\n }\n\n return prepare(emptyQuery);\n}\n\nexport { parseJSONata };\n"],"mappings":"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"}
|