datajunction-ui
Version:
DataJunction UI
1 lines • 528 kB
Source Map (JSON)
{"version":3,"file":"index-CfdG653R.cjs","sources":["../node_modules/react-syntax-highlighter/dist/esm/styles/hljs/solarized-dark.js","../src/app/components/QueryInfo.jsx","../node_modules/clsx/dist/clsx.m.js","../node_modules/react-querybuilder/dist/react-querybuilder.mjs","../src/app/pages/SQLBuilderPage/index.jsx"],"sourcesContent":["export default {\n \"hljs\": {\n \"display\": \"block\",\n \"overflowX\": \"auto\",\n \"padding\": \"0.5em\",\n \"background\": \"#002b36\",\n \"color\": \"#839496\"\n },\n \"hljs-comment\": {\n \"color\": \"#586e75\"\n },\n \"hljs-quote\": {\n \"color\": \"#586e75\"\n },\n \"hljs-keyword\": {\n \"color\": \"#859900\"\n },\n \"hljs-selector-tag\": {\n \"color\": \"#859900\"\n },\n \"hljs-addition\": {\n \"color\": \"#859900\"\n },\n \"hljs-number\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-string\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-meta .hljs-meta-string\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-literal\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-doctag\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-regexp\": {\n \"color\": \"#2aa198\"\n },\n \"hljs-title\": {\n \"color\": \"#268bd2\"\n },\n \"hljs-section\": {\n \"color\": \"#268bd2\"\n },\n \"hljs-name\": {\n \"color\": \"#268bd2\"\n },\n \"hljs-selector-id\": {\n \"color\": \"#268bd2\"\n },\n \"hljs-selector-class\": {\n \"color\": \"#268bd2\"\n },\n \"hljs-attribute\": {\n \"color\": \"#b58900\"\n },\n \"hljs-attr\": {\n \"color\": \"#b58900\"\n },\n \"hljs-variable\": {\n \"color\": \"#b58900\"\n },\n \"hljs-template-variable\": {\n \"color\": \"#b58900\"\n },\n \"hljs-class .hljs-title\": {\n \"color\": \"#b58900\"\n },\n \"hljs-type\": {\n \"color\": \"#b58900\"\n },\n \"hljs-symbol\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-bullet\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-subst\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-meta\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-meta .hljs-keyword\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-selector-attr\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-selector-pseudo\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-link\": {\n \"color\": \"#cb4b16\"\n },\n \"hljs-built_in\": {\n \"color\": \"#dc322f\"\n },\n \"hljs-deletion\": {\n \"color\": \"#dc322f\"\n },\n \"hljs-formula\": {\n \"background\": \"#073642\"\n },\n \"hljs-emphasis\": {\n \"fontStyle\": \"italic\"\n },\n \"hljs-strong\": {\n \"fontWeight\": \"bold\"\n }\n};","import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport solarizedDark from 'react-syntax-highlighter/dist/esm/styles/hljs/solarized-dark';\nimport React from 'react';\n\nexport default function QueryInfo({\n id,\n state,\n engine_name,\n engine_version,\n errors,\n links,\n output_table,\n scheduled,\n started,\n finished,\n numRows,\n isList = false,\n}) {\n return isList === false ? (\n <div className=\"table-responsive\">\n <table className=\"card-inner-table table\">\n <thead className=\"fs-7 fw-bold text-gray-400 border-bottom-0\">\n <tr>\n <th>Query ID</th>\n <th>Engine</th>\n <th>State</th>\n <th>Scheduled</th>\n <th>Started</th>\n <th>Errors</th>\n <th>Links</th>\n <th>Output Table</th>\n <th>Number of Rows</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <span className=\"rounded-pill badge bg-secondary-soft\">{id}</span>\n </td>\n <td>\n <span className=\"rounded-pill badge bg-secondary-soft\">\n {engine_name}\n {' - '}\n {engine_version}\n </span>\n </td>\n <td>{state}</td>\n <td>{scheduled}</td>\n <td>{started}</td>\n <td>\n {errors?.length ? (\n errors.map((e, idx) => (\n <p key={`error-${idx}`}>\n <span className=\"rounded-pill badge bg-secondary-error\">\n {e}\n </span>\n </p>\n ))\n ) : (\n <></>\n )}\n </td>\n <td>\n {links?.length ? (\n links.map((link, idx) => (\n <p key={idx}>\n <a href={link} target=\"_blank\" rel=\"noreferrer\">\n {link}\n </a>\n </p>\n ))\n ) : (\n <></>\n )}\n </td>\n <td>{output_table}</td>\n <td>{numRows}</td>\n </tr>\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"rightbottom\">\n <ul style={{ padding: '20px' }}>\n <li className={'query-info'}>\n <label>Query ID</label>{' '}\n <span className=\"tag_value rounded-pill badge\">\n {links?.length ? (\n <a\n href={links[links.length - 1]}\n target={'_blank'}\n rel=\"noreferrer\"\n >\n {id}\n </a>\n ) : (\n id\n )}\n </span>\n </li>\n <li className={'query-info'}>\n <label>State</label>\n <span className=\"tag_value rounded-pill badge\">{state}</span>\n </li>\n <li className={'query-info'}>\n <label>Engine</label>{' '}\n <span className=\"tag_value rounded-pill badge\">\n {engine_name}\n {' - '}\n {engine_version}\n </span>\n </li>\n <li className={'query-info'}>\n <label>Scheduled</label> {scheduled}\n </li>\n <li className={'query-info'}>\n <label>Started</label> {started}\n </li>\n <li className={'query-info'}>\n <label>Finished</label> {finished}\n </li>\n <li className={'query-info'}>\n <label>Logs</label>{' '}\n {errors?.length ? (\n errors.map((error, idx) => (\n <div\n key={`error-${idx}`}\n style={{\n height: '800px',\n width: '80%',\n overflow: 'scroll',\n borderRadius: '0',\n border: '1px solid #ccc',\n }}\n className=\"queryrunner-query\"\n >\n <SyntaxHighlighter\n language=\"javascript\"\n style={solarizedDark}\n wrapLines={true}\n >\n {error}\n </SyntaxHighlighter>\n </div>\n ))\n ) : (\n <></>\n )}\n </li>\n <li className={'query-info'}>\n <label>Links:</label>{' '}\n {links?.length ? (\n links.map((link, idx) => (\n <p key={idx}>\n <a href={link} target=\"_blank\" rel=\"noreferrer\">\n {link}\n </a>\n </p>\n ))\n ) : (\n <></>\n )}\n </li>\n <li className={'query-info'}>\n <label>Output Table:</label> {output_table}\n </li>\n <li className={'query-info'}>\n <label>Rows:</label> {numRows}\n </li>\n </ul>\n </div>\n );\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/components/ActionElement.tsx\nimport * as React from \"react\";\nvar ActionElement = ({\n className,\n handleOnClick,\n label,\n title,\n disabled,\n disabledTranslation,\n testID\n}) => /* @__PURE__ */ React.createElement(\n \"button\",\n {\n type: \"button\",\n \"data-testid\": testID,\n disabled: disabled && !disabledTranslation,\n className,\n title: disabledTranslation && disabled ? disabledTranslation.title : title,\n onClick: (e) => handleOnClick(e)\n },\n disabledTranslation && disabled ? disabledTranslation.label : label\n);\nActionElement.displayName = \"ActionElement\";\n\n// src/components/DragHandle.tsx\nimport * as React2 from \"react\";\nimport { forwardRef } from \"react\";\nvar DragHandle = forwardRef(\n ({ className, label, title, testID }, dragRef) => /* @__PURE__ */ React2.createElement(\"span\", { \"data-testid\": testID, ref: dragRef, className, title }, label)\n);\nDragHandle.displayName = \"DragHandle\";\n\n// src/components/InlineCombinator.tsx\nimport * as React3 from \"react\";\n\n// src/defaults.ts\nvar placeholderName = \"~\";\nvar placeholderLabel = \"------\";\nvar defaultPlaceholderFieldName = placeholderName;\nvar defaultPlaceholderFieldLabel = placeholderLabel;\nvar defaultPlaceholderFieldGroupLabel = placeholderLabel;\nvar defaultPlaceholderOperatorName = placeholderName;\nvar defaultPlaceholderOperatorLabel = placeholderLabel;\nvar defaultPlaceholderOperatorGroupLabel = placeholderLabel;\nvar defaultJoinChar = \",\";\nvar defaultTranslations = {\n fields: {\n title: \"Fields\",\n placeholderName: defaultPlaceholderFieldName,\n placeholderLabel: defaultPlaceholderFieldLabel,\n placeholderGroupLabel: defaultPlaceholderFieldGroupLabel\n },\n operators: {\n title: \"Operators\",\n placeholderName: defaultPlaceholderOperatorName,\n placeholderLabel: defaultPlaceholderOperatorLabel,\n placeholderGroupLabel: defaultPlaceholderOperatorGroupLabel\n },\n value: {\n title: \"Value\"\n },\n removeRule: {\n label: \"x\",\n title: \"Remove rule\"\n },\n removeGroup: {\n label: \"x\",\n title: \"Remove group\"\n },\n addRule: {\n label: \"+Rule\",\n title: \"Add rule\"\n },\n addGroup: {\n label: \"+Group\",\n title: \"Add group\"\n },\n combinators: {\n title: \"Combinators\"\n },\n notToggle: {\n label: \"Not\",\n title: \"Invert this group\"\n },\n cloneRule: {\n label: \"\\u29C9\",\n title: \"Clone rule\"\n },\n cloneRuleGroup: {\n label: \"\\u29C9\",\n title: \"Clone group\"\n },\n dragHandle: {\n label: \"\\u205E\\u205E\",\n title: \"Drag handle\"\n },\n lockRule: {\n label: \"\\u{1F513}\",\n title: \"Lock rule\"\n },\n lockGroup: {\n label: \"\\u{1F513}\",\n title: \"Lock group\"\n },\n lockRuleDisabled: {\n label: \"\\u{1F512}\",\n title: \"Unlock rule\"\n },\n lockGroupDisabled: {\n label: \"\\u{1F512}\",\n title: \"Unlock group\"\n },\n valueSourceSelector: {\n title: \"Value source\"\n }\n};\nvar defaultOperators = [\n { name: \"=\", label: \"=\" },\n { name: \"!=\", label: \"!=\" },\n { name: \"<\", label: \"<\" },\n { name: \">\", label: \">\" },\n { name: \"<=\", label: \"<=\" },\n { name: \">=\", label: \">=\" },\n { name: \"contains\", label: \"contains\" },\n { name: \"beginsWith\", label: \"begins with\" },\n { name: \"endsWith\", label: \"ends with\" },\n { name: \"doesNotContain\", label: \"does not contain\" },\n { name: \"doesNotBeginWith\", label: \"does not begin with\" },\n { name: \"doesNotEndWith\", label: \"does not end with\" },\n { name: \"null\", label: \"is null\" },\n { name: \"notNull\", label: \"is not null\" },\n { name: \"in\", label: \"in\" },\n { name: \"notIn\", label: \"not in\" },\n { name: \"between\", label: \"between\" },\n { name: \"notBetween\", label: \"not between\" }\n];\nvar defaultOperatorNegationMap = {\n \"=\": \"!=\",\n \"!=\": \"=\",\n \"<\": \">=\",\n \"<=\": \">\",\n \">\": \"<=\",\n \">=\": \"<\",\n beginsWith: \"doesNotBeginWith\",\n doesNotBeginWith: \"beginsWith\",\n endsWith: \"doesNotEndWith\",\n doesNotEndWith: \"endsWith\",\n contains: \"doesNotContain\",\n doesNotContain: \"contains\",\n between: \"notBetween\",\n notBetween: \"between\",\n in: \"notIn\",\n notIn: \"in\",\n notNull: \"null\",\n null: \"notNull\"\n};\nvar defaultCombinators = [\n { name: \"and\", label: \"AND\" },\n { name: \"or\", label: \"OR\" }\n];\nvar defaultCombinatorsExtended = [\n ...defaultCombinators,\n { name: \"xor\", label: \"XOR\" }\n];\nvar standardClassnames = {\n queryBuilder: \"queryBuilder\",\n ruleGroup: \"ruleGroup\",\n header: \"ruleGroup-header\",\n body: \"ruleGroup-body\",\n combinators: \"ruleGroup-combinators\",\n addRule: \"ruleGroup-addRule\",\n addGroup: \"ruleGroup-addGroup\",\n cloneRule: \"rule-cloneRule\",\n cloneGroup: \"ruleGroup-cloneGroup\",\n removeGroup: \"ruleGroup-remove\",\n notToggle: \"ruleGroup-notToggle\",\n rule: \"rule\",\n fields: \"rule-fields\",\n operators: \"rule-operators\",\n value: \"rule-value\",\n removeRule: \"rule-remove\",\n betweenRules: \"betweenRules\",\n valid: \"queryBuilder-valid\",\n invalid: \"queryBuilder-invalid\",\n dndDragging: \"dndDragging\",\n dndOver: \"dndOver\",\n dndCopy: \"dndCopy\",\n dragHandle: \"queryBuilder-dragHandle\",\n disabled: \"queryBuilder-disabled\",\n lockRule: \"rule-lock\",\n lockGroup: \"ruleGroup-lock\",\n valueSource: \"rule-valueSource\",\n valueListItem: \"rule-value-list-item\",\n branches: \"queryBuilder-branches\"\n};\nvar defaultControlClassnames = {\n queryBuilder: \"\",\n ruleGroup: \"\",\n header: \"\",\n body: \"\",\n combinators: \"\",\n addRule: \"\",\n addGroup: \"\",\n cloneRule: \"\",\n cloneGroup: \"\",\n removeGroup: \"\",\n notToggle: \"\",\n rule: \"\",\n fields: \"\",\n operators: \"\",\n value: \"\",\n removeRule: \"\",\n dragHandle: \"\",\n lockRule: \"\",\n lockGroup: \"\",\n valueSource: \"\"\n};\nvar groupInvalidReasons = {\n empty: \"empty\",\n invalidCombinator: \"invalid combinator\",\n invalidIndependentCombinators: \"invalid independent combinators\"\n};\nvar TestID = {\n rule: \"rule\",\n ruleGroup: \"rule-group\",\n inlineCombinator: \"inline-combinator\",\n addGroup: \"add-group\",\n removeGroup: \"remove-group\",\n cloneGroup: \"clone-group\",\n cloneRule: \"clone-rule\",\n addRule: \"add-rule\",\n removeRule: \"remove-rule\",\n combinators: \"combinators\",\n fields: \"fields\",\n operators: \"operators\",\n valueEditor: \"value-editor\",\n notToggle: \"not-toggle\",\n dragHandle: \"drag-handle\",\n lockRule: \"lock-rule\",\n lockGroup: \"lock-group\",\n valueSourceSelector: \"value-source-selector\"\n};\nvar LogType = {\n parentPathDisabled: \"action aborted: parent path disabled\",\n pathDisabled: \"action aborted: path is disabled\",\n queryUpdate: \"query updated\",\n onAddRuleFalse: \"onAddRule callback returned false\",\n onAddGroupFalse: \"onAddGroup callback returned false\",\n onRemoveFalse: \"onRemove callback returned false\",\n add: \"rule or group added\",\n remove: \"rule or group removed\",\n update: \"rule or group updated\",\n move: \"rule or group moved\"\n};\n\n// src/components/InlineCombinator.tsx\nvar InlineCombinator = ({\n component: CombinatorSelectorComponent,\n independentCombinators: _independentCombinators,\n ...props\n}) => /* @__PURE__ */ React3.createElement(\"div\", { className: standardClassnames.betweenRules, \"data-testid\": TestID.inlineCombinator }, /* @__PURE__ */ React3.createElement(CombinatorSelectorComponent, { ...props, testID: TestID.combinators }));\nInlineCombinator.displayName = \"InlineCombinator\";\n\n// src/components/NotToggle.tsx\nimport * as React4 from \"react\";\nvar NotToggle = ({\n className,\n handleOnChange,\n title,\n label,\n checked,\n disabled,\n testID\n}) => /* @__PURE__ */ React4.createElement(\"label\", { \"data-testid\": testID, className, title }, /* @__PURE__ */ React4.createElement(\n \"input\",\n {\n type: \"checkbox\",\n onChange: (e) => handleOnChange(e.target.checked),\n checked: !!checked,\n disabled\n }\n), label);\nNotToggle.displayName = \"NotToggle\";\n\n// src/components/QueryBuilder.tsx\nimport * as React7 from \"react\";\n\n// src/hooks/useQueryBuilder.ts\nimport { clsx as clsx2 } from \"clsx\";\nimport { useCallback, useEffect as useEffect5, useMemo as useMemo4, useRef as useRef2, useState } from \"react\";\n\n// src/utils/arrayUtils.ts\nvar splitBy = (str, splitChar = defaultJoinChar) => typeof str === \"string\" ? str.split(`\\\\${splitChar}`).map((c) => c.split(splitChar)).reduce((prev, curr, idx) => {\n if (idx === 0) {\n return curr;\n }\n return [\n ...prev.slice(0, prev.length - 1),\n `${prev[prev.length - 1]}${splitChar}${curr[0]}`,\n ...curr.slice(1)\n ];\n}, []) : [];\nvar joinWith = (strArr, joinChar = defaultJoinChar) => strArr.map((str) => `${str ?? \"\"}`.replaceAll(joinChar, `\\\\${joinChar}`)).join(joinChar);\nvar trimIfString = (val) => typeof val === \"string\" ? val.trim() : val;\nvar toArray = (v) => Array.isArray(v) ? v.map(trimIfString) : typeof v === \"string\" ? splitBy(v, defaultJoinChar).filter((s) => !/^\\s*$/.test(s)).map((s) => s.trim()) : typeof v === \"number\" ? [v] : [];\nvar nullFreeArray = (arr) => arr.every(Boolean);\n\n// src/utils/isRuleGroup.ts\nvar isRuleGroup = (rg) => typeof rg === \"object\" && \"rules\" in rg && Array.isArray(rg.rules);\nvar isRuleGroupType = (rg) => isRuleGroup(rg) && \"combinator\" in rg;\nvar isRuleGroupTypeIC = (rg) => isRuleGroup(rg) && !(\"combinator\" in rg);\n\n// src/utils/convertQuery.ts\nvar processRuleOrStringOrRuleGroupIC = (r) => typeof r === \"object\" && \"rules\" in r ? generateRuleGroupICWithConsistentCombinators(r) : r;\nvar generateRuleGroupICWithConsistentCombinators = (rg) => {\n const returnArray = [];\n const push = (r) => returnArray.push(processRuleOrStringOrRuleGroupIC(r));\n let startIndex = 0;\n for (let i = 0; i < rg.rules.length; i += 2) {\n if (rg.rules.length === 1) {\n push(rg.rules[0]);\n } else if (rg.rules[i + 1] === \"and\") {\n startIndex = i;\n let j = 1;\n while (rg.rules[startIndex + j] === \"and\") {\n i += 2;\n j += 2;\n }\n returnArray.push({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error TS can't keep track of odd/even indexes here\n rules: rg.rules.slice(startIndex, i + 1).map(processRuleOrStringOrRuleGroupIC)\n });\n i -= 2;\n } else if (rg.rules[i + 1] === \"or\") {\n if (i === 0 || i === rg.rules.length - 3) {\n if (i === 0 || rg.rules[i - 1] === \"or\") {\n push(rg.rules[i]);\n }\n push(rg.rules[i + 1]);\n if (i === rg.rules.length - 3) {\n push(rg.rules[i + 2]);\n }\n } else {\n if (rg.rules[i - 1] === \"and\") {\n push(rg.rules[i + 1]);\n } else {\n push(rg.rules[i]);\n push(rg.rules[i + 1]);\n }\n }\n }\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error TS still thinks returnArray has length 0\n returnArray.length === 1 && typeof returnArray[0] === \"object\" && \"rules\" in returnArray[0]\n ) {\n return { ...rg, ...returnArray[0] };\n }\n return { ...rg, rules: returnArray };\n};\nvar convertFromIC = (rg) => {\n const processedRG = generateRuleGroupICWithConsistentCombinators(rg);\n const rulesAsMixedList = processedRG.rules.map(\n (r) => typeof r === \"string\" || !(\"rules\" in r) ? r : convertFromIC(r)\n );\n const combinator = rulesAsMixedList.length < 2 ? \"and\" : rulesAsMixedList[1];\n const rules = rulesAsMixedList.filter((r) => typeof r !== \"string\");\n return { ...processedRG, combinator, rules };\n};\nvar convertToIC = (rg) => {\n const { combinator, ...queryWithoutCombinator } = rg;\n const rules = [];\n rg.rules.forEach((r, idx, arr) => {\n if (\"rules\" in r) {\n rules.push(convertToIC(r));\n } else {\n rules.push(r);\n }\n if (idx < arr.length - 1) {\n rules.push(combinator);\n }\n });\n return { ...queryWithoutCombinator, rules };\n};\nfunction convertQuery(query) {\n return isRuleGroupTypeIC(query) ? convertFromIC(query) : convertToIC(query);\n}\n\n// src/utils/defaultValidator.ts\nvar defaultValidator = (query) => {\n const result = {};\n const validateRule = (_rule) => {\n };\n const validateGroup = (rg) => {\n const reasons = [];\n if (rg.rules.length === 0) {\n reasons.push(groupInvalidReasons.empty);\n } else if (!(\"combinator\" in rg)) {\n let invalidICs = false;\n for (let i = 0; i < rg.rules.length && !invalidICs; i++) {\n if (i % 2 === 0 && typeof rg.rules[i] === \"string\" || i % 2 === 1 && typeof rg.rules[i] !== \"string\" || i % 2 === 1 && typeof rg.rules[i] === \"string\" && !defaultCombinators.map((c) => c.name).includes(rg.rules[i])) {\n invalidICs = true;\n }\n }\n if (invalidICs) {\n reasons.push(groupInvalidReasons.invalidIndependentCombinators);\n }\n }\n if (\"combinator\" in rg && !defaultCombinators.map((c) => c.name).includes(rg.combinator) && rg.rules.length > 1) {\n reasons.push(groupInvalidReasons.invalidCombinator);\n }\n if (rg.id) {\n if (reasons.length) {\n result[rg.id] = { valid: false, reasons };\n } else {\n result[rg.id] = true;\n }\n }\n rg.rules.forEach((r) => {\n if (typeof r === \"string\") {\n } else if (\"rules\" in r) {\n validateGroup(r);\n } else {\n validateRule(r);\n }\n });\n };\n validateGroup(query);\n return result;\n};\n\n// src/utils/optGroupUtils.ts\nvar isOptionGroupArray = (arr) => Array.isArray(arr) && arr.length > 0 && \"options\" in arr[0];\nvar getOption = (arr, name) => (isOptionGroupArray(arr) ? arr.flatMap((og) => og.options) : arr).find((op) => op.name === name);\nvar getFirstOption = (arr) => !Array.isArray(arr) || arr.length === 0 ? null : isOptionGroupArray(arr) ? arr[0].options[0].name : arr[0].name;\n\n// src/utils/filterFieldsByComparator.ts\nvar filterFieldsByComparator = (field, fields, operator) => {\n if (!field.comparator) {\n const filterOutSameName = (f) => f.name !== field.name;\n if (isOptionGroupArray(fields)) {\n return fields.map((og) => ({\n ...og,\n options: og.options.filter(filterOutSameName)\n }));\n }\n return fields.filter(filterOutSameName);\n }\n const filterByComparator = (fieldToCompare) => {\n if (field.name === fieldToCompare.name) {\n return false;\n }\n if (typeof field.comparator === \"string\") {\n return field[field.comparator] === fieldToCompare[field.comparator];\n }\n return field.comparator(fieldToCompare, operator);\n };\n if (isOptionGroupArray(fields)) {\n return fields.map((og) => ({ ...og, options: og.options.filter(filterByComparator) })).filter((og) => og.options.length > 0);\n }\n return fields.filter(filterByComparator);\n};\n\n// src/utils/misc.ts\nvar numericRegex = /^\\s*[+-]?(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)([Ee][+-]?\\d+)?\\s*$/;\nvar isPojo = (obj) => obj === null || typeof obj !== \"object\" ? false : Object.getPrototypeOf(obj) === Object.prototype;\n\n// src/utils/parseNumber.ts\nvar parseNumber = (v, { parseNumbers }) => {\n if (typeof v === \"bigint\" || typeof v === \"number\") {\n return v;\n }\n return parseNumbers && (parseNumbers === \"native\" || numericRegex.test(v)) ? parseFloat(v) : v;\n};\n\n// src/utils/formatQuery/utils.ts\nvar mapSQLOperator = (op) => {\n switch (op.toLowerCase()) {\n case \"null\":\n return \"is null\";\n case \"notnull\":\n return \"is not null\";\n case \"notin\":\n return \"not in\";\n case \"notbetween\":\n return \"not between\";\n case \"contains\":\n case \"beginswith\":\n case \"endswith\":\n return \"like\";\n case \"doesnotcontain\":\n case \"doesnotbeginwith\":\n case \"doesnotendwith\":\n return \"not like\";\n default:\n return op;\n }\n};\nvar mongoOperators = {\n \"=\": \"$eq\",\n \"!=\": \"$ne\",\n \"<\": \"$lt\",\n \"<=\": \"$lte\",\n \">\": \"$gt\",\n \">=\": \"$gte\",\n in: \"$in\",\n notIn: \"$nin\"\n};\nvar celCombinatorMap = {\n and: \"&&\",\n or: \"||\"\n};\nvar jsonLogicAdditionalOperators = {\n startsWith: (a, b) => typeof a === \"string\" && a.startsWith(b),\n endsWith: (a, b) => typeof a === \"string\" && a.endsWith(b)\n};\nvar numerifyValues = (rg) => ({\n ...rg,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error TS doesn't keep track of odd/even indexes here\n rules: rg.rules.map((r) => {\n if (typeof r === \"string\") {\n return r;\n }\n if (\"rules\" in r) {\n return numerifyValues(r);\n }\n let { value } = r;\n if (typeof value === \"string\") {\n value = parseNumber(value, { parseNumbers: true });\n }\n return { ...r, value };\n })\n});\nvar isValidValue = (v) => typeof v === \"string\" && v.length > 0 || typeof v === \"number\" && !isNaN(v) || typeof v !== \"string\" && typeof v !== \"number\";\nvar shouldRenderAsNumber = (v, parseNumbers) => parseNumbers && (typeof v === \"number\" || typeof v === \"bigint\" || typeof v === \"string\" && numericRegex.test(v));\nvar isValueProcessorLegacy = (vp) => vp.length >= 3;\nvar quoteFieldNamesWithArray = (quoteFieldNamesWith = [\"\", \"\"]) => Array.isArray(quoteFieldNamesWith) ? quoteFieldNamesWith : typeof quoteFieldNamesWith === \"string\" ? [quoteFieldNamesWith, quoteFieldNamesWith] : quoteFieldNamesWith ?? [\"\", \"\"];\n\n// src/utils/formatQuery/defaultRuleProcessorCEL.ts\nvar shouldNegate = (op) => /^(does)?not/i.test(op);\nvar escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== \"string\" || !escapeQuotes ? v : v.replaceAll(`\"`, `\\\\\"`);\nvar defaultRuleProcessorCEL = ({ field, operator, value, valueSource }, { escapeQuotes, parseNumbers } = {}) => {\n const valueIsField = valueSource === \"field\";\n const operatorTL = operator.replace(/^=$/, \"==\");\n const useBareValue = typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\" || shouldRenderAsNumber(value, parseNumbers);\n switch (operatorTL) {\n case \"<\":\n case \"<=\":\n case \"==\":\n case \"!=\":\n case \">\":\n case \">=\":\n return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`}`;\n case \"contains\":\n case \"doesNotContain\": {\n const negate = shouldNegate(operatorTL) ? \"!\" : \"\";\n return `${negate}${field}.contains(${valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`})`;\n }\n case \"beginsWith\":\n case \"doesNotBeginWith\": {\n const negate = shouldNegate(operatorTL) ? \"!\" : \"\";\n return `${negate}${field}.startsWith(${valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`})`;\n }\n case \"endsWith\":\n case \"doesNotEndWith\": {\n const negate = shouldNegate(operatorTL) ? \"!\" : \"\";\n return `${negate}${field}.endsWith(${valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`})`;\n }\n case \"null\":\n return `${field} == null`;\n case \"notNull\":\n return `${field} != null`;\n case \"in\":\n case \"notIn\": {\n const negate = shouldNegate(operatorTL);\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `${negate ? \"!(\" : \"\"}${field} in [${valueAsArray.map(\n (val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n ).join(\", \")}]${negate ? \")\" : \"\"}`;\n } else {\n return \"\";\n }\n }\n case \"between\":\n case \"notBetween\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && !!valueAsArray[0] && !!valueAsArray[1]) {\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true) ? parseFloat(first) : NaN;\n const secondNum = shouldRenderAsNumber(second, true) ? parseFloat(second) : NaN;\n let firstValue = isNaN(firstNum) ? valueIsField ? `${first}` : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"` : firstNum;\n let secondValue = isNaN(secondNum) ? valueIsField ? `${second}` : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"` : secondNum;\n if (firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n if (operator === \"between\") {\n return `(${field} >= ${firstValue} && ${field} <= ${secondValue})`;\n } else {\n return `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n }\n } else {\n return \"\";\n }\n }\n }\n return \"\";\n};\n\n// src/utils/formatQuery/defaultRuleProcessorMongoDB.ts\nvar escapeDoubleQuotes2 = (v) => typeof v !== \"string\" ? v : v.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(`\"`, `\\\\\"`);\nvar defaultRuleProcessorMongoDB = ({ field, operator, value, valueSource }, { parseNumbers } = {}) => {\n const valueIsField = valueSource === \"field\";\n const useBareValue = typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\" || shouldRenderAsNumber(value, parseNumbers);\n if (operator === \"=\" && !valueIsField) {\n return `{\"${field}\":${useBareValue ? trimIfString(value) : `\"${escapeDoubleQuotes2(value)}\"`}}`;\n }\n switch (operator) {\n case \"<\":\n case \"<=\":\n case \"=\":\n case \"!=\":\n case \">\":\n case \">=\": {\n const mongoOperator = mongoOperators[operator];\n return valueIsField ? `{\"$expr\":{\"${mongoOperator}\":[\"$${field}\",\"$${value}\"]}}` : `{\"${field}\":{\"${mongoOperator}\":${useBareValue ? trimIfString(value) : `\"${escapeDoubleQuotes2(value)}\"`}}}`;\n }\n case \"contains\":\n return valueIsField ? `{\"$where\":\"this.${field}.includes(this.${value})\"}` : `{\"${field}\":{\"$regex\":\"${escapeDoubleQuotes2(value)}\"}}`;\n case \"beginsWith\":\n return valueIsField ? `{\"$where\":\"this.${field}.startsWith(this.${value})\"}` : `{\"${field}\":{\"$regex\":\"^${escapeDoubleQuotes2(value)}\"}}`;\n case \"endsWith\":\n return valueIsField ? `{\"$where\":\"this.${field}.endsWith(this.${value})\"}` : `{\"${field}\":{\"$regex\":\"${escapeDoubleQuotes2(value)}$\"}}`;\n case \"doesNotContain\":\n return valueIsField ? `{\"$where\":\"!this.${field}.includes(this.${value})\"}` : `{\"${field}\":{\"$not\":{\"$regex\":\"${escapeDoubleQuotes2(value)}\"}}}`;\n case \"doesNotBeginWith\":\n return valueIsField ? `{\"$where\":\"!this.${field}.startsWith(this.${value})\"}` : `{\"${field}\":{\"$not\":{\"$regex\":\"^${escapeDoubleQuotes2(value)}\"}}}`;\n case \"doesNotEndWith\":\n return valueIsField ? `{\"$where\":\"!this.${field}.endsWith(this.${value})\"}` : `{\"${field}\":{\"$not\":{\"$regex\":\"${escapeDoubleQuotes2(value)}$\"}}}`;\n case \"null\":\n return `{\"${field}\":null}`;\n case \"notNull\":\n return `{\"${field}\":{\"$ne\":null}}`;\n case \"in\":\n case \"notIn\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return valueIsField ? `{\"$where\":\"${operator === \"notIn\" ? \"!\" : \"\"}[${valueAsArray.map((val) => `this.${val}`).join(\",\")}].includes(this.${field})\"}` : `{\"${field}\":{\"${mongoOperators[operator]}\":[${valueAsArray.map(\n (val) => shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `\"${escapeDoubleQuotes2(val)}\"`\n ).join(\",\")}]}}`;\n } else {\n return \"\";\n }\n }\n case \"between\":\n case \"notBetween\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true) ? parseFloat(first) : NaN;\n const secondNum = shouldRenderAsNumber(second, true) ? parseFloat(second) : NaN;\n const firstValue = valueIsField || !isNaN(firstNum) ? `${first}` : `\"${escapeDoubleQuotes2(first)}\"`;\n const secondValue = valueIsField || !isNaN(secondNum) ? `${second}` : `\"${escapeDoubleQuotes2(second)}\"`;\n if (operator === \"between\") {\n return valueIsField ? `{\"$and\":[{\"$expr\":{\"$gte\":[\"$${field}\",\"$${firstValue}\"]}},{\"$expr\":{\"$lte\":[\"$${field}\",\"$${secondValue}\"]}}]}` : `{\"${field}\":{\"$gte\":${firstValue},\"$lte\":${secondValue}}}`;\n } else {\n return valueIsField ? `{\"$or\":[{\"$expr\":{\"$lt\":[\"$${field}\",\"$${firstValue}\"]}},{\"$expr\":{\"$gt\":[\"$${field}\",\"$${secondValue}\"]}}]}` : `{\"$or\":[{\"${field}\":{\"$lt\":${firstValue}}},{\"${field}\":{\"$gt\":${secondValue}}}]}`;\n }\n } else {\n return \"\";\n }\n }\n }\n return \"\";\n};\n\n// src/utils/formatQuery/defaultRuleProcessorSpEL.ts\nvar shouldNegate2 = (op) => /^(does)?not/i.test(op);\nvar wrapInNegation = (clause, negate) => negate ? `!(${clause})` : `${clause}`;\nvar escapeSingleQuotes = (v, escapeQuotes) => typeof v !== \"string\" || !escapeQuotes ? v : v.replaceAll(`'`, `\\\\'`);\nvar defaultRuleProcessorSpEL = ({ field, operator, value, valueSource }, { escapeQuotes, parseNumbers } = {}) => {\n const valueIsField = valueSource === \"field\";\n const operatorTL = operator.replace(/^=$/, \"==\");\n const useBareValue = typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\" || shouldRenderAsNumber(value, parseNumbers);\n switch (operatorTL) {\n case \"<\":\n case \"<=\":\n case \"==\":\n case \"!=\":\n case \">\":\n case \">=\":\n return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;\n case \"contains\":\n case \"doesNotContain\":\n return wrapInNegation(\n `${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`,\n shouldNegate2(operatorTL)\n );\n case \"beginsWith\":\n case \"doesNotBeginWith\": {\n const valueTL = valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === \"string\" && !value.startsWith(\"^\") || useBareValue ? \"^\" : \"\"}${escapeSingleQuotes(value, escapeQuotes)}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate2(operatorTL));\n }\n case \"endsWith\":\n case \"doesNotEndWith\": {\n const valueTL = valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === \"string\" && !value.endsWith(\"$\") || useBareValue ? \"$\" : \"\"}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate2(operatorTL));\n }\n case \"null\":\n return `${field} == null`;\n case \"notNull\":\n return `${field} != null`;\n case \"in\":\n case \"notIn\": {\n const negate = shouldNegate2(operatorTL) ? \"!\" : \"\";\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `${negate}(${valueAsArray.map(\n (val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`\n ).join(\" or \")})`;\n } else {\n return \"\";\n }\n }\n case \"between\":\n case \"notBetween\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && !!valueAsArray[0] && !!valueAsArray[1]) {\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true) ? parseFloat(first) : NaN;\n const secondNum = shouldRenderAsNumber(second, true) ? parseFloat(second) : NaN;\n let firstValue = isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;\n let secondValue = isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;\n if (firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n if (operator === \"between\") {\n return `(${field} >= ${firstValue} and ${field} <= ${secondValue})`;\n } else {\n return `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n }\n } else {\n return \"\";\n }\n }\n }\n return \"\";\n};\n\n// src/utils/formatQuery/defaultValueProcessorByRule.ts\nvar escapeSingleQuotes2 = (v, escapeQuotes) => escapeQuotes && typeof v === \"string\" ? v.replaceAll(`'`, `''`) : v;\nvar defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQuotes, parseNumbers, quoteFieldNamesWith } = {}) => {\n const valueIsField = valueSource === \"field\";\n const [qfnwPre, qfnwPost] = quoteFieldNamesWithArray(quoteFieldNamesWith);\n const operatorLowerCase = operator.toLowerCase();\n const wrapFieldName = (f) => `${qfnwPre}${f}${qfnwPost}`;\n switch (operatorLowerCase) {\n case \"null\":\n case \"notnull\": {\n return \"\";\n }\n case \"in\":\n case \"notin\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `(${valueAsArray.map(\n (v) => valueIsField ? wrapFieldName(v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `'${escapeSingleQuotes2(v, escapeQuotes)}'`\n ).join(\", \")})`;\n }\n return \"\";\n }\n case \"between\":\n case \"notbetween\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {\n const [first, second] = valueAsArray;\n return valueIsField ? `${wrapFieldName(first)} and ${wrapFieldName(second)}` : shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers) ? `${trimIfString(first)} and ${trimIfString(second)}` : `'${escapeSingleQuotes2(first, escapeQuotes)}' and '${escapeSingleQuotes2(\n second,\n escapeQuotes\n )}'`;\n }\n return \"\";\n }\n case \"contains\":\n case \"doesnotcontain\":\n return valueIsField ? `'%' || ${wrapFieldName(value)} || '%'` : `'%${escapeSingleQuotes2(value, escapeQuotes)}%'`;\n case \"beginswith\":\n case \"doesnotbeginwith\":\n return valueIsField ? `${wrapFieldName(value)} || '%'` : `'${escapeSingleQuotes2(value, escapeQuotes)}%'`;\n case \"endswith\":\n case \"doesnotendwith\":\n return valueIsField ? `'%' || ${wrapFieldName(value)}` : `'%${escapeSingleQuotes2(value, escapeQuotes)}'`;\n }\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `'${escapeSingleQuotes2(value, escapeQuotes)}'`;\n};\n\n// src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts\nvar convertOperator = (op) => op.replace(/^(=)$/, \"$1=\").replace(/^notNull$/i, \"!=\").replace(/^null$/i, \"==\");\nvar negateIfNotOp = (op, jsonRule) => /^(does)?not/i.test(op) ? { \"!\": jsonRule } : jsonRule;\nvar defaultRuleProcessorJsonLogic = ({ field, operator, value, valueSource }, { parseNumbers } = {}) => {\n const valueIsField = valueSource === \"field\";\n const fieldObject = { var: field };\n const fieldOrNumberRenderer = (v) => valueIsField ? { var: `${v}` } : shouldRenderAsNumber(v, parseNumbers) ? parseFloat(v) : v;\n switch (operator) {\n case \"<\":\n case \"<=\":\n case \"=\":\n case \"!=\":\n case \">\":\n case \">=\":\n return {\n [convertOperator(operator)]: [fieldObject, fieldOrNumberRenderer(value)]\n };\n case \"null\":\n case \"notNull\": {\n return {\n [`${operator === \"notNull\" ? \"!\" : \"=\"}=`]: [fieldObject, null]\n };\n }\n case \"in\":\n case \"notIn\": {\n const valueAsArray = toArray(value).map(fieldOrNumberRenderer);\n if (valueAsArray.length > 0) {\n const jsonRule = { in: [fieldObject, valueAsArray] };\n return negateIfNotOp(operator, jsonRule);\n }\n return false;\n }\n case \"between\":\n case \"notBetween\": {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {\n let [first, second] = valueAsArray;\n if (!valueIsField && shouldRenderAsNumber(first, true) && shouldRenderAsNumber(second, true)) {\n const firstNum = parseFloat(first);\n const secondNum = parseFloat(second);\n if (secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else if (valueIsField) {\n first = { var: first };\n second = { var: second };\n }\n const jsonRule = { \"<=\": [first, fieldObject, second] };\n return negateIfNotOp(operator, jsonRule);\n }\n return false;\n }\n case \"contains\":\n case \"doesNotContain\": {\n const jsonRule = {\n in: [fieldOrNumberRenderer(value), fieldObject]\n };\n return negateIfNotOp(operator, jsonRule);\n }\n case \"beginsWith\":\n case \"doesNotBeginWith\": {\n const jsonRule = {\n startsWith: [fieldObject, fieldOrNumberRenderer(value)]\n };\n return negateIfNotOp(operator, jsonRule);\n }\n case \"endsWith\":\n case \"doesNotEndWith\": {\n const jsonRule = {\n endsWith: [fieldObject, fieldOrNumberRenderer(value)]\n };\n return negateIfNotOp(operator, jsonRule);\n }\n }\n return false;\n};\n\n// src/utils/formatQuery/defaultRuleProcessorSQL.ts\nvar defaultRuleProcessorSQL = (rule, {\n parseNumbers,\n escapeQuotes,\n quoteFieldNamesWith = [\"\", \"\"],\n valueProcessor = defaultValueProcessorByRule\n} = {}) => {\n const value = valueProcessor(rule, { parseNumbers, escapeQuotes, quoteFieldNamesWith });\n const operator = mapSQLOperator(rule.operator);\n const operatorLowerCase = operator.toLowerCase();\n if ((operatorLowerCase === \"in\" || operatorLowerCase === \"not in\" || operatorLowerCase === \"between\" || operatorLowerCase === \"not between\") && !value) {\n return \"\";\n }\n const [qFNWpre, qFNWpost] = quoteFieldNamesWithArray(quoteFieldNamesWith);\n return `${qFNWpre}${rule.field}${qFNWpost} ${operator} ${value}`.trim();\n};\n\n// src/utils/isRuleOrGroupValid.ts\nvar isValidationResult = (vr) => isPojo(vr) && typeof vr.valid === \"boolean\";\nvar isRuleOrGroupValid = (rg, validationResult, validator) => {\n if (typeof validationResult === \"boolean\") {\n return validationResult;\n }\n if (isValidationResult(validationResult)) {\n return validationResult.valid;\n }\n if (typeof validator === \"function\" && !(\"rules\" in rg)) {\n const vr = validator(rg);\n if (typeof vr === \"boolean\") {\n return vr;\n }\n if (isValidationResult(vr)) {\n return vr.valid;\n }\n }\n return true;\n};\n\n// src/utils/uniq.ts\nvar uniqByName = (originalArray) => {\n const names = /* @__PURE__ */ new Set();\n const newArray = [];\n originalArray.forEach((el) => {\n if (!names.has(el.name)) {\n names.add(el.name);\n newArray.push(el);\n }\n });\n return newArray;\n};\nvar uniqOptGroups = (originalArray) => {\n const labels = /* @__PURE__ */ new Set();\n const names = /* @__PURE__ */ new Set();\n const newArray = [];\n originalArray.forEach((el) => {\n if (!labels.has(el.label)) {\n labels.add(el.label);\n const optionsForThisGroup = [];\n el.options.forEach((opt) => {\n if (!names.has(opt.name)) {\n names.add(opt.name);\n optionsForThisGroup.push(opt);\n }\n });\n newArray.push({ ...el, options: optionsForThisGroup });\n }\n });\n return newArray;\n};\n\n// src/utils/formatQuery/formatQuery.ts\nfunction formatQuery(ruleGroup, options = {}) {\n let format = \"json\";\n let valueProcessorInternal = defaultValueProcessorByRule;\n let ruleProcessorInternal = null;\n let quoteFieldNamesWith = [\"\", \"\"];\n let validator = () => true;\n let fields = [];\n let validationMap = {};\n let fallbackExpression = \"\";\n let paramPrefix = \":\";\n let parseNumbers = false;\n let placeholderFieldName = defaultPlaceholderFieldName;\n let placeholderOperatorName = defaultPlaceholderOperatorName;\n if (typeof options === \"string\") {\n format = options.toLowerCase();\n if (format === \"mongodb\") {\n ruleProcessorInternal = defaultRuleProcessorMongoDB;\n } else if (format === \"cel\") {\n ruleProcessorInternal = defaultRuleProcessorCEL;\n } else if (format === \"spel\") {\n ruleProcessorInternal = defaultRuleProcessorSpEL;\n } else if (format === \"jsonlogic\") {\n ruleProcessorInternal = defaultRuleProcessorJsonLogic;\n }\n } else {\n format = (options.format ?? \"json\").toLowerCase();\n const { valueProcessor = null, ruleProcessor = null } = options;\n if (typeof ruleProcessor === \"function\") {\n ruleProcessorInternal = ruleProcessor;\n }\n valueProcessorInternal = typeof valueProcessor === \"function\" ? (r, opts) => isValueProcessorLegacy(valueProcessor) ? valueProcessor(r.field, r.operator, r.value, r.valueSource) : valueProcessor(r, opts) : format === \"mongodb\" ? ruleProcessorInternal ?? defaultRuleProcessorMongoDB : format === \"cel\" ? ruleProcessorInternal ?? defaultRuleProcessorCEL : format === \"spel\" ? ruleProcessorInternal ?? defaultRuleProcessorSpEL : format === \"jsonlogic\" ? ruleProcessorInternal ?? defaultRuleProcessorJsonLogic : defaultValueProcessorByRule;\n quoteFieldNamesWith = quoteFieldNamesWithArray(options.quoteFieldNamesWith);\n validator = options.validator ?? (() => true);\n fields = options.fields ?? [];\n fallbackExpression = options.fallbackExpression ?? \"\";\n paramPrefix = options.paramPrefix ?? \":\";\n parseNumbers = !!options.parseNumbers;\n placeholderFieldName = options.placeholderFieldName ?? defaultPlaceholderFieldName;\n placeholderOperatorName = options.placeholderOperatorName ?? defaultPlaceholderOperatorName;\n }\n if (!fallbackExpression) {\n fallbackExpression = format === \"mongodb\" ? '\"$and\":[{\"$expr\":true}]' : format === \"cel\" || format === \"spel\" ? \"1 == 1\" : \"(1 = 1)\";\n }\n if (format === \"json\" || format === \"json_without_ids\") {\n const rg = parseNumbers ? numerifyValues(ruleGroup) : ruleGroup;\n if (format === \"json\") {\n return JSON.stringify(rg, null, 2);\n }\n return JSON.stringify(rg, [\n \"rules\",\n \"field\",\n \"value\",\n \"operator\",\n \"combinator\",\n \"not\",\n \"valueSource\"\n ]);\n }\n if (typeof validator === \"function\") {\n const validationResult = validator(ruleGroup);\n if (typeof validationResult === \"boolean\") {\n if (validationResult === false) {\n return format === \"parameterized\" ? { sql: fallbackExpression, params: [] } : format === \"parameterized_named\" ? { sql: fallbackExpression, params: {} } : format === \"mongodb\" ? `{${fallbackExpression}}` : format === \"jsonlogic\" ? false : fallbackExpression;\n }\n } else {\n validationMap = validationResult;\n }\n }\n const validatorMap = {};\n const uniqueFields = uniqByName(fields);\n uniqueFields.forEach((f) => {\n if (typeof f.validator === \"function\") {\n validatorMap[f.name] = f.validator;\n }\n });\n const validateRule = (rule) => {\n let validationResult = void 0;\n let fieldValidator = void 0;\n if (rule.id) {\n validationResult = validationMap[rule.id];\n }\n if (fields.length) {\n const fieldArr = fields.filter((f) => f.name === rule.field);\n if (fieldArr.length) {\n const field = fieldArr[0];\n if (typeof field.validator === \"function\") {\n fieldValidator = field.validator;\n }\n }\n }\n return [validationResult, fieldValidator];\n };\n if (format === \"sql\") {\n const processRuleGroup = (rg, outermost) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */\n \"\"])) {\n return outermost ? fallbackExpression : \"\";\n }\n const processedRules = rg.rules.map((rule) => {\n if (typeof rule === \"string\") {\n return rule;\n }\n if (\"rules\" in rule) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperator