@react-querybuilder/core 8.15.0 → 8.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +114 -53
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +89 -16
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +402 -19
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +89 -16
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  7. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  8. package/dist/formatQuery.d.mts +67 -2
  9. package/dist/formatQuery.d.ts +67 -2
  10. package/dist/formatQuery.js +402 -19
  11. package/dist/formatQuery.js.map +1 -1
  12. package/dist/formatQuery.mjs +396 -20
  13. package/dist/formatQuery.mjs.map +1 -1
  14. package/dist/{import-0wp72lLT.d.mts → import-BHlzBLM_.d.mts} +2 -2
  15. package/dist/{import-yRVJh7E1.d.ts → import-C6imciDf.d.ts} +2 -2
  16. package/dist/{index-D5TXNIzF.d.ts → index-Cjapnb-H.d.ts} +14 -7
  17. package/dist/{index-Lht_Wq3V.d.mts → index-D-Iej37L.d.mts} +14 -7
  18. package/dist/parseCEL.d.mts +2 -2
  19. package/dist/parseCEL.d.ts +2 -2
  20. package/dist/parseCEL.js.map +1 -1
  21. package/dist/parseCEL.mjs.map +1 -1
  22. package/dist/parseCypher.d.mts +49 -0
  23. package/dist/parseCypher.d.ts +49 -0
  24. package/dist/parseCypher.js +578 -0
  25. package/dist/parseCypher.js.map +1 -0
  26. package/dist/parseCypher.mjs +575 -0
  27. package/dist/parseCypher.mjs.map +1 -0
  28. package/dist/parseGremlin.d.mts +35 -0
  29. package/dist/parseGremlin.d.ts +35 -0
  30. package/dist/parseGremlin.js +192 -0
  31. package/dist/parseGremlin.js.map +1 -0
  32. package/dist/parseGremlin.mjs +191 -0
  33. package/dist/parseGremlin.mjs.map +1 -0
  34. package/dist/parseJSONata.d.mts +2 -2
  35. package/dist/parseJSONata.d.ts +2 -2
  36. package/dist/parseJSONata.js.map +1 -1
  37. package/dist/parseJSONata.mjs.map +1 -1
  38. package/dist/parseJsonLogic.d.mts +2 -2
  39. package/dist/parseJsonLogic.d.ts +2 -2
  40. package/dist/parseJsonLogic.js.map +1 -1
  41. package/dist/parseJsonLogic.mjs.map +1 -1
  42. package/dist/parseMongoDB.d.mts +2 -2
  43. package/dist/parseMongoDB.d.ts +2 -2
  44. package/dist/parseMongoDB.js.map +1 -1
  45. package/dist/parseMongoDB.mjs.map +1 -1
  46. package/dist/parseSPARQL.d.mts +34 -0
  47. package/dist/parseSPARQL.d.ts +34 -0
  48. package/dist/parseSPARQL.js +253 -0
  49. package/dist/parseSPARQL.js.map +1 -0
  50. package/dist/parseSPARQL.mjs +251 -0
  51. package/dist/parseSPARQL.mjs.map +1 -0
  52. package/dist/parseSQL.d.mts +2 -2
  53. package/dist/parseSQL.d.ts +2 -2
  54. package/dist/parseSQL.js.map +1 -1
  55. package/dist/parseSQL.mjs.map +1 -1
  56. package/dist/parseSpEL.d.mts +2 -2
  57. package/dist/parseSpEL.d.ts +2 -2
  58. package/dist/parseSpEL.js.map +1 -1
  59. package/dist/parseSpEL.mjs.map +1 -1
  60. package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -1
  61. package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -1
  62. package/dist/react-querybuilder_core.d.mts +89 -16
  63. package/dist/react-querybuilder_core.legacy-esm.d.ts +89 -16
  64. package/dist/react-querybuilder_core.legacy-esm.js +408 -27
  65. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  66. package/dist/react-querybuilder_core.mjs +396 -20
  67. package/dist/react-querybuilder_core.mjs.map +1 -1
  68. package/dist/react-querybuilder_core.production.d.mts +89 -16
  69. package/dist/react-querybuilder_core.production.mjs +1 -1
  70. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  71. package/dist/transformQuery.d.mts +1 -1
  72. package/dist/transformQuery.d.ts +1 -1
  73. package/formatQuery/package.json +1 -1
  74. package/package.json +47 -3
  75. package/parseCEL/package.json +1 -1
  76. package/parseCypher/package.json +4 -0
  77. package/parseGremlin/package.json +4 -0
  78. package/parseJSONata/package.json +1 -1
  79. package/parseJsonLogic/package.json +1 -1
  80. package/parseMongoDB/package.json +1 -1
  81. package/parseSPARQL/package.json +4 -0
  82. package/parseSQL/package.json +1 -1
  83. package/parseSpEL/package.json +1 -1
  84. package/transformQuery/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import { E as DefaultRuleGroupType, x as DefaultRuleGroupTypeIC } from "./index-Cjapnb-H.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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"}
@@ -1,5 +1,5 @@
1
- import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-Lht_Wq3V.mjs";
2
- import { t as ParserCommonOptions } from "./import-0wp72lLT.mjs";
1
+ import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-D-Iej37L.mjs";
2
+ import { t as ParserCommonOptions } from "./import-BHlzBLM_.mjs";
3
3
 
4
4
  //#region src/utils/parseJSONata/parseJSONata.d.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-D5TXNIzF.js";
2
- import { t as ParserCommonOptions } from "./import-yRVJh7E1.js";
1
+ import { E as DefaultRuleGroupType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-Cjapnb-H.js";
2
+ import { t as ParserCommonOptions } from "./import-C6imciDf.js";
3
3
 
4
4
  //#region src/utils/parseJSONata/parseJSONata.d.ts
5
5
  /**
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,qBAAqB,SAAuC;AACvE,QAAO,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS;;AAElE,MAAM,uBAAuB,SAC3B,kBAAkB,KAAK,IAAI,KAAK,SAAS;AAG3C,MAAa,iBAAiB,SAC5B,kBAAkB,KAAK,IACvB,KAAK,SAAS,UACd,MAAM,QAAQ,KAAK,MAAM,IACzB,KAAK,MAAM,SAAS,KACpB,kBAAkB,KAAK,MAAM,GAAG;AAClC,MAAa,iBAAiB,SAC5B,kBAAkB,KAAK,IACvB,KAAK,SAAS,UACd,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,SAAS;AACtB,MAAa,uBAAuB,SAClC,cAAc,KAAK,IAAI,KAAK,MAAM,OAAM,MAAK,cAAc,EAAE,CAAC;AAGhE,MAAa,kBAAkB,SAC7B,kBAAkB,KAAK,IACvB,KAAK,SAAS,WACd,MAAM,QAAQ,KAAK,YAAY,IAC/B,KAAK,YAAY,SAAS,KAC1B,kBAAkB,KAAK,YAAY,GAAG;AAGxC,MAAa,mBAAmB,SAC9B,kBAAkB,KAAK,IAAI,KAAK,SAAS,YAAY,OAAO,KAAK,UAAU;AAC7E,MAAa,mBAAmB,SAC9B,kBAAkB,KAAK,IAAI,KAAK,SAAS,YAAY,OAAO,KAAK,UAAU;AAC7E,MAAa,oBAAoB,SAC/B,kBAAkB,KAAK,IAAI,KAAK,SAAS,WAAW,OAAO,KAAK,UAAU;AAC5E,MAAa,iBAAiB,SAC5B,kBAAkB,KAAK,IAAI,KAAK,SAAS,WAAW,KAAK,UAAU;AACrE,MAAa,kBAAkB,SAC7B,kBAAkB,KAAK,IAAI,KAAK,SAAS,WAAW,KAAK,iBAAiB;AAG5E,MAAa,gBAAgB,SAC3B,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,eAAe,SAC1B,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAG9C,MAAa,kBAAkB,SAC7B,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,qBAAqB,SAChC,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,wBAAwB,SACnC,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,+BAA+B,SAC1C,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,qBAAqB,SAChC,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,4BAA4B,SACvC,oBAAoB,KAAK,IAAI,KAAK,UAAU;AAC9C,MAAa,eAAe,SAC1B,oBAAoB,KAAK,IACzB,KAAK,UAAU,QACf,cAAc,KAAK,IAAI,IACvB,cAAc,KAAK,IAAI;AAGzB,MAAa,gBAAgB,SAC3B,kBAAkB,KAAK,IACvB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,UAAU,IAC7B,kBAAkB,KAAK,UAAU,GAAG,IACpC,kBAAkB,KAAK,UAAU,IACjC,KAAK,UAAU,UAAU,SACzB,KAAK,UAAU,SAAS;AAC1B,MAAa,qBAAqB,SAChC,kBAAkB,KAAK,IACvB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,UAAU,IAC7B,KAAK,UAAU,UAAU,KACzB,kBAAkB,KAAK,UAAU,GAAG,IACpC,kBAAkB,KAAK,UAAU,IACjC,KAAK,UAAU,UAAU,cACzB,KAAK,UAAU,SAAS;AAC1B,MAAa,qBAAqB,SAChC,kBAAkB,KAAK,IACvB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,UAAU,IAC7B,KAAK,UAAU,SAAS,KACxB,gBAAgB,KAAK,UAAU,GAAG,IAClC,kBAAkB,KAAK,UAAU,IACjC,KAAK,UAAU,UAAU,cACzB,KAAK,UAAU,SAAS;AAG1B,MAAa,iBAAiB,SAC5B,kBAAkB,KAAK,IACvB,KAAK,SAAS,WACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,YAAY;AACjC,MAAa,sBAAsB,SAAuB;AACxD,QACE,gBAAgB,KAAK,IACrB,gBAAgB,KAAK,IACrB,iBAAiB,KAAK,IACtB,cAAc,KAAK,IACnB,kBAAkB,KAAK;;AAG3B,MAAa,0BAA0B,SACrC,cAAc,KAAK,IAAI,KAAK,YAAY,OAAM,MAAK,mBAAmB,EAAE,CAAC;AAC3E,MAAa,2BAA2B,SACtC,cAAc,KAAK,IAAI,KAAK,YAAY,OAAM,MAAK,oBAAoB,EAAE,CAAC;AAC5E,MAAa,uBAAuB,SAClC,mBAAmB,KAAK,IACxB,eAAe,KAAK,IACpB,oBAAoB,KAAK,IACzB,uBAAuB,KAAK,IAC5B,wBAAwB,KAAK,IAC7B,kBAAkB,KAAK;AACzB,MAAa,uBACX,SAQA,eAAe,KAAK,IACpB,kBAAkB,KAAK,IACvB,qBAAqB,KAAK,IAC1B,4BAA4B,KAAK,IACjC,kBAAkB,KAAK,IACvB,yBAAyB,KAAK;AAEhC,MAAa,iBAAiB,SAAmB;AAC/C,KAAI,kBAAkB,KAAK,CACzB,QAAO,cAAc,KAAK,UAAU,GAAG;UAC9B,oBAAoB,KAAK,CAClC,QAAO,iBAAiB,KAAK;UACpB,uBAAuB,KAAK,CACrC,QAAO,KAAK,YAAY,KAAK,MAAW,cAAc,EAAE,CAAC;UAChD,wBAAwB,KAAK,CACtC,QAAO,KAAK,YAAY,KAAK,MAAW,iBAAiB,EAAE,CAAC;AAE9D,QAAO,KAAK;;AAGd,MAAa,oBAAoB,SAC/B,oBAAoB,KAAK,GACrB,KAAK,MAAM,KAAI,MAAK,EAAE,MAAM,CAAC,KAAK,IAAI,qCACJ;AAExC,MAAa,qBACX,QACA,SACwB;AACxB,KAAI,MAAM;AACR,MAAI,WAAW,IAAK,QAAO;AAC3B,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,IAAK,QAAO;AAC3B,MAAI,WAAW,KAAM,QAAO;;AAE9B,QAAO;;AAGT,MAAa,uBAGT;CACF,UAAU;CACV,YAAY;CACZ,UAAU;CACX;AAKD,MAAa,yBACX,SACgD;;AAEhD,KAAI,aAAa,KAAK,IAAI,YAAY,KAAK,EAAE;EAC3C,MAAM,EAAE,KAAK,KAAK,OAAO,eAAe;AACxC,MAAI,aAAa,IAAI,IAAI,YAAY,IAAI,CACvC,QAAO;GAAC,GAAG,sBAAsB,IAAI;GAAE;GAAY;GAAI;AAEzD,SAAO;GAAC;GAAK;GAAY;GAAI;;;AAG/B,QAAO,EAAE;;AAGX,MAAa,0BACX,SAC8E;CAC9E,MAAM,MAAM,sBAAsB,KAAK;CACvC,MAAM,cAAyF,EAAE;CACjG,IAAI,aAAa;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,EACnC,KAAI,IAAI,IAAI,OAAO,OAAO;AACxB,eAAa;EACb,IAAI,IAAI;AACR,SAAO,IAAI,aAAa,OAAO,OAAO;AACpC,QAAK;AACL,QAAK;;EAEP,MAAM,eAAe,IAAI,MAAM,YAAY,IAAI,EAAE;AACjD,cAAY,KAAK,aAAa;AAC9B,OAAK;YACI,IAAI,IAAI,OAAO,KACxB,KAAI,MAAM,KAAK,MAAM,IAAI,SAAS,GAAG;AACnC,MAAI,MAAM,KAAK,IAAI,IAAI,OAAO,KAC5B,aAAY,KAAK,IAAI,GAAG;AAE1B,cAAY,KAAK,IAAI,IAAI,GAAG;AAC5B,MAAI,MAAM,IAAI,SAAS,EACrB,aAAY,KAAK,IAAI,IAAI,GAAG;YAG1B,IAAI,IAAI,OAAO,MACjB,aAAY,KAAK,IAAI,IAAI,GAAG;KAE5B,aAAY,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG;AAK5C,KAAI,YAAY,WAAW,KAAK,MAAM,QAAQ,YAAY,GAAG,CAE3D,QAAO,YAAY;AAErB,QAAO;;;;ACjMT,SAAS,aACP,cACA,UAA+B,EAAE,EACR;CACzB,MAAM,EAAE,QAAQ,wBAAwB,eAAe,SAAS;CAChE,MAAM,KAAK,CAAC,CAAC;CACb,MAAM,aAAaA,4BAAAA,eAAe,OAAO;CAEzC,MAAM,gBACJ,WACA,UACA,yBAEAC,4BAAAA,iBAAiB;EACf;EACA;EACA;EACA;EACA,iBAAiB,SAAS;EAC3B,CAAC;CAEJ,MAAM,aAAsC;EAC1C,OAAO,EAAE;EACT,GAAI,KAAK,EAAE,GAAG,EAAE,YAAY,OAAO;EACpC;CAED,MAAM,mBACJ,MACA,cAGI,EAAE,KAC+C;EACrD,MAAM,EAAE,iBAAiB,oBAAoB,sBAAsB,OAAO;AAC1E,MAAI,eAAe,KAAK,EAAE;AACxB,OACE,aAAa,KAAK,YAAY,GAAG,IACjC,YAAY,KAAK,YAAY,GAAG,IAChC,eAAe,KAAK,YAAY,GAAG,CAEnC,QAAO,gBAAgB,KAAK,YAAY,GAAG;GAE7C,MAAM,cAAc,gBAAgB,KAAK,YAAY,GAAG;;AAExD,OAAI,YACF,QAAO,KACF,EAAE,OAAO,CAAC,YAAY,EAAE,GACxB;IACC,YAAY;IACZ,OAAO,CAAC,YAAY;IACrB;aAEE,aAAa,KAAK,IAAI,YAAY,KAAK,EAAE;AAClD,OAAI,IAAI;IAEN,MAAM,QADY,sBAAsB,KACjB,CAAC,KAAI,MAAK;AAC/B,SAAI,OAAO,MAAM,SACf,QAAO;AAET,YAAO,gBAAgB,EAAE;MACzB;AAGF,QAAI,CAAC,MAAM,MAAM,QAAQ,CACvB,QAAO;AAIT,UACI,OACA,GAAG,WAAW,MACb,GAAG,OAAO,SAAS,GAAG,OAAO,SAC9B,CAACC,oBAAAA,YAAY,GAAG,GAAG,IACnB,CAACA,oBAAAA,YAAY,GAAG,GAAG,EAAE,MAAM,IAC7B,MAAM,GAAG,UAAU,MAAM,GAAG,UAC3B,MAAM,GAAG,eAAe,cAAc,MAAM,GAAG,eAAe,aAC7D,MAAM,OAAO,UACX,MAAM,GAAG,aAAa,QAAQ,MAAM,GAAG,aAAa,QACnD,MAAM,GAAG,aAAa,QAAQ,MAAM,GAAG,aAAa,SACtD,MAAM,OAAO,SACV,MAAM,GAAG,aAAa,OAAO,MAAM,GAAG,aAAa,OAClD,MAAM,GAAG,aAAa,OAAO,MAAM,GAAG,aAAa,MAE1D,QAAO;KACL,OAAO,MAAM,GAAG;KAChB,UAAU,MAAM,OAAO,QAAQ,YAAY;KAC3C,OACG,MAAM,OAAO,SAAS,MAAM,GAAG,aAAa,QAC5C,MAAM,OAAO,QAAQ,MAAM,GAAG,aAAa,MACxC,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM,GAChC,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM;KACtC,GAAI,MAAM,GAAG,cAAc,EAAE,aAAa,MAAM,GAAG,aAAa,GAAG;KACpE;AAGH,WAAO,EACE,OACR;;GAEH,MAAM,YAAY,uBAAuB,KAAK;GAC9C,MAAM,aAAa,UAAU;GAM7B,MAAM,QALe,UAClB,QAAO,MAAK,MAAM,QAAQ,EAAE,IAAK,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,UAAU,EAAG,CAC9E,KAAI,MACH,MAAM,QAAQ,EAAE,GAAG,EAAE,QAAO,OAAM,CAAC,CAAC,KAAK,OAAO,OAAO,YAAY,UAAU,GAAG,GAAG,EAE7D,CACvB,KAAK,QAAuD;AAC3D,QAAI,MAAM,QAAQ,IAAI,CACpB,QAAO;KACL,YAAY;KACZ,OAAO,IAAI,KAAI,MAAK,gBAAgB,EAAE,CAAC,CAAC,OAAO,QAAQ;KACxD;AAEH,WAAO,gBAAgB,IAAI;KAC3B,CACD,OAAO,QAAQ;AAGlB,SACI,OACA,GAAG,WAAW,KAAK,CAACA,oBAAAA,YAAY,GAAG,GAAG,IAAI,CAACA,oBAAAA,YAAY,GAAG,GAAG,EAAE,MAAM,IACvE,MAAM,GAAG,UAAU,MAAM,GAAG,UAC3B,MAAM,GAAG,eAAe,cAAc,MAAM,GAAG,eAAe,aAC7D,eAAe,UACb,MAAM,GAAG,aAAa,QAAQ,MAAM,GAAG,aAAa,QACnD,MAAM,GAAG,aAAa,QAAQ,MAAM,GAAG,aAAa,SACtD,eAAe,SACZ,MAAM,GAAG,aAAa,OAAO,MAAM,GAAG,aAAa,OAClD,MAAM,GAAG,aAAa,OAAO,MAAM,GAAG,aAAa,MAE1D,QAAO;IACL,OAAO,MAAM,GAAG;IAChB,UAAU,eAAe,QAAQ,YAAY;IAC7C,OACG,eAAe,SAAS,MAAM,GAAG,aAAa,QAC9C,eAAe,QAAQ,MAAM,GAAG,aAAa,MAC1C,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM,GAChC,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM;IACtC,GAAI,MAAM,GAAG,cAAc,EAAE,aAAa,MAAM,GAAG,aAAa,GAAG;IACpE;;AAIH,OAAI,MAAM,SAAS,EACjB,QAAO;IAAE;IAAY;IAAO;aAErB,aAAa,KAAK,EAAE;GAC7B,MAAM,cAAc,gBAAgB,KAAK,UAAU,GAAG;;AAEtD,OAAI,aAAa;AACf,QACE,CAACA,oBAAAA,YAAY,YAAY,KACxB,YAAY,aAAa,cACxB,YAAY,aAAa,gBACzB,YAAY,aAAa,YAE3B,QAAO;KACL,GAAG;KACH,UAAU,qBAAqB,YAAY;KAC5C;AAEH,WAAO,KACF;KAAE,OAAO,CAAC,YAAY;KAAE,KAAK;KAAM,GACnC;KACC,YAAY;KACZ,OAAO,CAAC,YAAY;KACpB,KAAK;KACN;;aAEE,kBAAkB,KAAK,EAAE;GAClC,MAAM,CAAC,MAAM,QAAQ,KAAK;GAC1B,IAAI,QAAgB;GACpB,IAAI,QAAyB;GAC7B,IAAI,cAAuC,KAAA;;AAE3C,OAAI,oBAAoB,KAAK,EAAE;AAC7B,YAAQ,iBAAiB,KAAK;AAC9B,QAAI,oBAAoB,KAAK,EAAE;AAC7B,aAAQ,iBAAiB,KAAK;AAC9B,mBAAc;eAGV,gBAAgB,KAAK,IAAI,eAAe,KAAK,CAC/C,SAAQ,cAAc,KAAK;;;AAMjC,OACE,gBAAgB,UACZ,aAAa,OAAO,YAAY,MAAgB,GAChD,aAAa,OAAO,WAAW,CAEnC,QAAO;IACL;IACA,UAAU;IACV,OAAO;IACP,GAAI,cAAc,EAAE,aAAa,GAAG,EAAE;IACvC;aAEM,YAAY,KAAK,EAAE;GAC5B,MAAM,QAAQ,iBAAiB,KAAK,IAAI;GACxC,IAAI,cAAuC,KAAA;AAC3C,OAAI,wBAAwB,KAAK,IAAI,CACnC,eAAc;AAEhB,OAAI,oBAAoB,KAAK,IAAI,EAAE;IAEjC,MAAM,QAAe,cAAc,KAAK,IAAI;;AAE5C,QACE,SACA,MAAM,OAAM,MAAK,aAAa,OAAO,MAAM,gBAAgB,UAAU,IAAI,KAAA,EAAU,CAAC,CAEpF,QAAO;KAAE;KAAO,UAAU;KAAM;KAAO,GAAI,cAAc,EAAE,aAAa,GAAG,EAAE;KAAG;;aAG3E,oBAAoB,KAAK,EAAE;GACpC,IAAI,QAAuB;GAE3B,IAAI,QAAa,KAAA;GACjB,IAAI,cAAuC,KAAA;GAC3C,IAAI,OAAO;GACX,MAAM,EAAE,KAAK,QAAQ;AAErB,OAAI,oBAAoB,IAAI,IAAI,oBAAoB,IAAI,EAAE;AACxD,YAAQ,iBAAiB,IAAI;AAC7B,YAAQ,cAAc,IAAI;AAC1B,QAAI,oBAAoB,IAAI,CAC1B,eAAc;cAIZ,oBAAoB,IAAI,IAAI,oBAAoB,IAAI,EAAE;AACxD,WAAO;AACP,YAAQ,iBAAiB,IAAI;AAC7B,YAAQ,cAAc,IAAI;;GAG9B,IAAI,WAAW,kBAAkB,KAAK,OAAO,KAAK;AAClD,OAAI,UAAU,SAAS,aAAa,OAAO,aAAa,MACtD,YAAW,aAAa,MAAM,SAAS;AAEzC,OACE,SACA,aAAa,OAAO,UAAU,gBAAgB,UAAU,QAAQ,KAAA,EAAU,IAC1E,UAAU,KAAA,EAEV,QAAO,cAAc;IAAE;IAAO;IAAU;IAAO;IAAa,GAAG;IAAE;IAAO;IAAU;IAAO;;AAG7F,SAAO;;CAGT,MAAM,UAAU,QAAQ,cAAcC,4BAAAA,oBAAuB,MAAS;CAEtE,IAAI;AACJ,KAAI;AACF,iBAAA,GAAA,QAAA,SAAsB,aAAa;SAC7B;AACN,SAAO,QAAQ,WAAW;;CAI5B,MAAM,SAAS,gBAFI,YAAY,KAEU,CAAC;AAC1C,KAAI,QAAQ;AACV,MAAID,oBAAAA,YAAY,OAAO,CACrB,QAAO,QAAQ,OAAO;AAExB,SAAO,QAAQ;GAAE,OAAO,CAAC,OAAO;GAAE,GAAI,KAAK,EAAE,GAAG,EAAE,YAAY,OAAO;GAAG,CAAC;;AAG3E,QAAO,QAAQ,WAAW"}