@react-querybuilder/core 8.9.2 → 8.11.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 (113) hide show
  1. package/dist/{arrayUtils-BF1P8iHS.mjs → arrayUtils-A_OXU9W1.mjs} +3 -75
  2. package/dist/arrayUtils-A_OXU9W1.mjs.map +1 -0
  3. package/dist/arrayUtils-QxZOZTf6.js +73 -0
  4. package/dist/arrayUtils-QxZOZTf6.js.map +1 -0
  5. package/dist/basic-DEc65Kng.d.mts +363 -0
  6. package/dist/basic-Dd_M2f3M.d.ts +363 -0
  7. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +806 -1366
  8. package/dist/cjs/react-querybuilder_core.cjs.development.js +455 -116
  9. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  10. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +806 -1366
  11. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  12. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  13. package/dist/{convertQuery-H7RhQiIc.mjs → convertQuery-CqX3rPvj.mjs} +3 -3
  14. package/dist/{convertQuery-H7RhQiIc.mjs.map → convertQuery-CqX3rPvj.mjs.map} +1 -1
  15. package/dist/{export-DyrnTh6K.d.ts → export-Dy4FckB-.d.ts} +7 -6
  16. package/dist/{export-r-V7bU31.d.mts → export-t1V2N8pz.d.mts} +7 -6
  17. package/dist/formatQuery.d.mts +3 -2
  18. package/dist/formatQuery.d.ts +3 -2
  19. package/dist/formatQuery.js +217 -87
  20. package/dist/formatQuery.js.map +1 -1
  21. package/dist/formatQuery.mjs +217 -87
  22. package/dist/formatQuery.mjs.map +1 -1
  23. package/dist/{import-Cksobmln.d.ts → import-Cz8canKo.d.mts} +3 -3
  24. package/dist/{import-BwbbP4oU.d.mts → import-DtS9Ocx5.d.ts} +3 -3
  25. package/dist/{isRuleGroup-CnhYpLOM.mjs → isRuleGroup-CYcfPgbg.mjs} +2 -2
  26. package/dist/{isRuleGroup-CnhYpLOM.mjs.map → isRuleGroup-CYcfPgbg.mjs.map} +1 -1
  27. package/dist/lexer-C53tqS2p.js +406 -0
  28. package/dist/lexer-C53tqS2p.js.map +1 -0
  29. package/dist/{optGroupUtils-CXLgyg2i.js → optGroupUtils-B0hTpodo.js} +114 -1
  30. package/dist/optGroupUtils-B0hTpodo.js.map +1 -0
  31. package/dist/{optGroupUtils-Duv-M8rf.mjs → optGroupUtils-VeZ3k7-1.mjs} +86 -3
  32. package/dist/optGroupUtils-VeZ3k7-1.mjs.map +1 -0
  33. package/dist/parseCEL.d.mts +292 -11
  34. package/dist/parseCEL.d.ts +292 -11
  35. package/dist/parseCEL.js +874 -1125
  36. package/dist/parseCEL.js.map +1 -1
  37. package/dist/parseCEL.mjs +828 -1126
  38. package/dist/parseCEL.mjs.map +1 -1
  39. package/dist/parseJSONata.d.mts +3 -2
  40. package/dist/parseJSONata.d.ts +3 -2
  41. package/dist/parseJSONata.js +49 -77
  42. package/dist/parseJSONata.js.map +1 -1
  43. package/dist/parseJSONata.mjs +4 -5
  44. package/dist/parseJSONata.mjs.map +1 -1
  45. package/dist/parseJsonLogic.d.mts +4 -3
  46. package/dist/parseJsonLogic.d.ts +4 -3
  47. package/dist/parseJsonLogic.js +5 -6
  48. package/dist/parseJsonLogic.js.map +1 -1
  49. package/dist/parseJsonLogic.mjs +5 -6
  50. package/dist/parseJsonLogic.mjs.map +1 -1
  51. package/dist/parseMongoDB.d.mts +3 -2
  52. package/dist/parseMongoDB.d.ts +3 -2
  53. package/dist/parseMongoDB.js +15 -16
  54. package/dist/parseMongoDB.js.map +1 -1
  55. package/dist/parseMongoDB.mjs +5 -6
  56. package/dist/parseMongoDB.mjs.map +1 -1
  57. package/dist/{parseNumber-BtGKa58z.mjs → parseNumber-CXdMVNFx.mjs} +2 -2
  58. package/dist/{parseNumber-BtGKa58z.mjs.map → parseNumber-CXdMVNFx.mjs.map} +1 -1
  59. package/dist/{parseNumber-Bcys1kOH.js → parseNumber-D4iQDxK-.js} +1 -1
  60. package/dist/{parseNumber-Bcys1kOH.js.map → parseNumber-D4iQDxK-.js.map} +1 -1
  61. package/dist/parseSQL.d.mts +3 -2
  62. package/dist/parseSQL.d.ts +3 -2
  63. package/dist/parseSQL.js +2691 -3036
  64. package/dist/parseSQL.js.map +1 -1
  65. package/dist/parseSQL.mjs +2691 -3037
  66. package/dist/parseSQL.mjs.map +1 -1
  67. package/dist/parseSpEL.d.mts +3 -2
  68. package/dist/parseSpEL.d.ts +3 -2
  69. package/dist/parseSpEL.js +7 -9
  70. package/dist/parseSpEL.js.map +1 -1
  71. package/dist/parseSpEL.mjs +5 -6
  72. package/dist/parseSpEL.mjs.map +1 -1
  73. package/dist/{prepareQueryObjects-BqFEs4eV.js → prepareQueryObjects-BOUWfel5.js} +4 -5
  74. package/dist/prepareQueryObjects-BOUWfel5.js.map +1 -0
  75. package/dist/{prepareQueryObjects-CS6Wmhmf.mjs → prepareQueryObjects-DPCC-iHp.mjs} +6 -7
  76. package/dist/prepareQueryObjects-DPCC-iHp.mjs.map +1 -0
  77. package/dist/query-builder-layout.css +1 -1
  78. package/dist/query-builder-layout.css.map +1 -1
  79. package/dist/query-builder.css +1 -1
  80. package/dist/query-builder.css.map +1 -1
  81. package/dist/react-querybuilder_core.d.mts +806 -1366
  82. package/dist/react-querybuilder_core.legacy-esm.d.ts +806 -1366
  83. package/dist/react-querybuilder_core.legacy-esm.js +455 -114
  84. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  85. package/dist/react-querybuilder_core.mjs +448 -117
  86. package/dist/react-querybuilder_core.mjs.map +1 -1
  87. package/dist/react-querybuilder_core.production.d.mts +806 -1366
  88. package/dist/react-querybuilder_core.production.mjs +1 -1
  89. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  90. package/dist/styles/_layout.scss +61 -17
  91. package/dist/styles/_main.scss +22 -4
  92. package/dist/{transformQuery-FL_nlpp5.js → transformQuery-CWDPogO5.js} +1 -1
  93. package/dist/{transformQuery-FL_nlpp5.js.map → transformQuery-CWDPogO5.js.map} +1 -1
  94. package/dist/{transformQuery-DdMvmrCh.mjs → transformQuery-DCCpjtyq.mjs} +3 -3
  95. package/dist/{transformQuery-DdMvmrCh.mjs.map → transformQuery-DCCpjtyq.mjs.map} +1 -1
  96. package/dist/transformQuery.d.mts +1 -1
  97. package/dist/transformQuery.d.ts +1 -1
  98. package/dist/transformQuery.js +1 -1
  99. package/dist/transformQuery.mjs +2 -2
  100. package/package.json +14 -12
  101. package/dist/arrayUtils-BF1P8iHS.mjs.map +0 -1
  102. package/dist/arrayUtils-D5EoIsKP.js +0 -164
  103. package/dist/arrayUtils-D5EoIsKP.js.map +0 -1
  104. package/dist/basic-BfD-7CN3.d.mts +0 -1235
  105. package/dist/basic-C8xXKHIA.d.ts +0 -1235
  106. package/dist/objectUtils-BBZSfZJz.js +0 -17
  107. package/dist/objectUtils-BBZSfZJz.js.map +0 -1
  108. package/dist/objectUtils-BtWdcZVG.mjs +0 -11
  109. package/dist/objectUtils-BtWdcZVG.mjs.map +0 -1
  110. package/dist/optGroupUtils-CXLgyg2i.js.map +0 -1
  111. package/dist/optGroupUtils-Duv-M8rf.mjs.map +0 -1
  112. package/dist/prepareQueryObjects-BqFEs4eV.js.map +0 -1
  113. package/dist/prepareQueryObjects-CS6Wmhmf.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"react-querybuilder_core.mjs","names":["defaultPlaceholderFieldName: typeof defaultPlaceholderName","defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel","defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorName: typeof defaultPlaceholderName","defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueName: typeof defaultPlaceholderName","defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel","defaultOperatorLabelMap: Record<DefaultOperatorName, string>","defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string>","defaultOperators: DefaultOperators","defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName>","defaultCombinators: DefaultCombinators","defaultCombinatorsExtended: DefaultCombinatorsExtended","defaultMatchModes: DefaultMatchModes","defaultControlClassnames: Classnames","rootPath: Path","v","numericRegex: RegExp","numericQuantityRegex","rules: (RuleGroupTypeIC | RuleType | string)[]","defaultValidator: QueryValidator","result: ValidationMap","reasons: any[]","idObj: { name?: string; value?: string }","newArray: T[]","newArray: OptionGroup<ToFullOption<T>>[]","optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[]","valAsNum: number | bigint","celCombinatorMap: {\n and: '&&';\n or: '||';\n}","jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n>","result: string[]","defaultNLTranslations: NLTranslations","defaultRuleGroupProcessorCEL: RuleGroupProcessor<string>","expression: string","shouldNegate","defaultRuleProcessorCEL: RuleProcessor","defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor","expressions: Record<string, unknown>[]","processNumber","defaultRuleProcessorMongoDBQuery: RuleProcessor","defaultRuleProcessorMongoDB: RuleProcessor","defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string>","expression: string","shouldNegate","negate","defaultRuleProcessorSpEL: RuleProcessor","escapeStringValueQuotes","defaultValueProcessorByRule: ValueProcessorByRule","defaultRuleProcessorDrizzle: RuleProcessor","defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n>","ruleGroupSQL: SQL | undefined","defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>>","defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string>","expression: string","defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic>","jsonRuleGroup: RQBJsonLogic","defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string>","rules: string[]","defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string>","expressions: string[]","defaultRuleGroupProcessorNL: RuleGroupProcessor<string>","defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n>","params: any[]","paramsNamed: Record<string, any>","fieldParams: Map<string, Set<string>>","defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSQL: RuleGroupProcessor<string>","negateIfNotOp","textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>>","defaultRuleProcessorElasticSearch: RuleProcessor","negate","defaultRuleProcessorJSONata: RuleProcessor","defaultRuleProcessorJsonLogic: RuleProcessor","fieldObject: JsonLogicVar","jsonRule: RQBJsonLogic","negate","defaultRuleProcessorLDAP: RuleProcessor","defaultValueProcessorNL: ValueProcessorByRule","defaultExportOperatorMap: ExportOperatorMap","defaultOperatorProcessorNL: RuleProcessor","defaultRuleProcessorNL: RuleProcessor","defaultOperatorProcessorSQL: RuleProcessor","defaultRuleProcessorSQL: RuleProcessor","defaultRuleProcessorParameterized: RuleProcessor","params: any[]","paramsNamed: Record<string, any>","inParams: string[]","defaultRuleProcessorPrisma: RuleProcessor","defaultRuleProcessorSequelize: RuleProcessor","sqlDialectPresets: Record<SQLPreset, FormatQueryOptions>","formatQueryOptionPresets: Record<string, FormatQueryOptions>","defaultOperatorProcessor: RuleProcessor","defaultFallbackExpressions: Partial<Record<ExportFormat, string>>","optObj: MostFormatQueryOptions","valueProcessor: ValueProcessorByRule","getOperators: FormatQueryOptions['getOperators']","validationMap: ValidationMap","validatorMap: Record<string, RuleValidator>","validationResult: boolean | ValidationResult | undefined","fieldValidator: RuleValidator | undefined","finalOptions: FormatQueryFinalOptions","defaultValueProcessor: ValueProcessorLegacy","defaultMongoDBValueProcessor: ValueProcessorLegacy","defaultCELValueProcessor: ValueProcessorLegacy","defaultSpELValueProcessor: ValueProcessorLegacy","defaultValueProcessorCELByRule: RuleProcessor","defaultValueProcessorMongoDBByRule: RuleProcessor","defaultValueProcessorSpELByRule: RuleProcessor","target: FindPathReturnType","t: RuleGroupTypeAny | RuleType | string","commonAncestorPath: Path","target: RuleType | RuleGroupTypeAny","generateAccessibleDescription: ADG","dummyFD","matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[]","defaultValueSourcesArray: ValueSourceFullOptions","valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions)"],"sources":["../src/defaults.ts","../src/utils/arrayUtils.ts","../src/utils/clsx.ts","../src/utils/misc.ts","../src/utils/isRuleGroup.ts","../src/utils/convertQuery.ts","../src/utils/defaultValidator.ts","../src/utils/optGroupUtils.ts","../src/utils/filterFieldsByComparator.ts","../src/utils/parseNumber.ts","../src/utils/transformQuery.ts","../src/utils/isRuleOrGroupValid.ts","../src/utils/getParseNumberMethod.ts","../src/utils/formatQuery/utils.ts","../src/utils/formatQuery/defaultRuleGroupProcessorCEL.ts","../src/utils/formatQuery/defaultRuleProcessorCEL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSpEL.ts","../src/utils/formatQuery/defaultRuleProcessorSpEL.ts","../src/utils/formatQuery/defaultValueProcessorByRule.ts","../src/utils/formatQuery/defaultRuleProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleGroupProcessorLDAP.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorNL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleGroupProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSequelize.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleProcessorLDAP.ts","../src/utils/formatQuery/defaultValueProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleProcessorSequelize.ts","../src/utils/formatQuery/formatQuery.ts","../src/utils/formatQuery/index.ts","../src/utils/pathUtils.ts","../src/utils/generateAccessibleDescription.ts","../src/utils/generateID.ts","../src/utils/getMatchModesUtil.ts","../src/utils/getValidationClassNames.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/mergeClassnames.ts","../src/utils/objectUtils.ts","../src/utils/prepareQueryObjects.ts","../src/utils/regenerateIDs.ts","../src/utils/queryTools.ts"],"sourcesContent":["import type {\n Classnames,\n DefaultCombinatorName,\n DefaultCombinatorNameExtended,\n DefaultOperatorName,\n MatchMode,\n Path,\n StringUnionToFullOptionArray,\n} from './types';\n\n// DO NOT ALTER OR REMOVE REGION NAMES. Some of them are used\n// to generate code snippets in the documentation.\n\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderName = '~';\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderLabel = '------';\n/**\n * Default `name` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n\n/**\n * Default character used to `.join` and `.split` arrays.\n *\n * @group Defaults\n */\nexport const defaultJoinChar = ',';\n\nexport type DefaultOperators = StringUnionToFullOptionArray<DefaultOperatorName>;\n\nexport const defaultOperatorLabelMap: Record<DefaultOperatorName, string> = {\n '=': '=',\n '!=': '!=',\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n contains: 'contains',\n beginsWith: 'begins with',\n endsWith: 'ends with',\n doesNotContain: 'does not contain',\n doesNotBeginWith: 'does not begin with',\n doesNotEndWith: 'does not end with',\n null: 'is null',\n notNull: 'is not null',\n in: 'in',\n notIn: 'not in',\n between: 'between',\n notBetween: 'not between',\n};\n\nexport const defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string> = {\n and: 'AND',\n or: 'OR',\n xor: 'XOR',\n};\n\n/**\n * Default operator list.\n *\n * @group Defaults\n */\n// #region docs-operators\nexport const defaultOperators: DefaultOperators = [\n { name: '=', value: '=', label: '=' },\n { name: '!=', value: '!=', label: '!=' },\n { name: '<', value: '<', label: '<' },\n { name: '>', value: '>', label: '>' },\n { name: '<=', value: '<=', label: '<=' },\n { name: '>=', value: '>=', label: '>=' },\n { name: 'contains', value: 'contains', label: 'contains' },\n { name: 'beginsWith', value: 'beginsWith', label: 'begins with' },\n { name: 'endsWith', value: 'endsWith', label: 'ends with' },\n { name: 'doesNotContain', value: 'doesNotContain', label: 'does not contain' },\n { name: 'doesNotBeginWith', value: 'doesNotBeginWith', label: 'does not begin with' },\n { name: 'doesNotEndWith', value: 'doesNotEndWith', label: 'does not end with' },\n { name: 'null', value: 'null', label: 'is null' },\n { name: 'notNull', value: 'notNull', label: 'is not null' },\n { name: 'in', value: 'in', label: 'in' },\n { name: 'notIn', value: 'notIn', label: 'not in' },\n { name: 'between', value: 'between', label: 'between' },\n { name: 'notBetween', value: 'notBetween', label: 'not between' },\n];\n// #endregion\n\n/**\n * Map of default operators to their respective opposite/negating operators.\n *\n * @group Defaults\n */\nexport const defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName> = {\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} satisfies Record<DefaultOperatorName, DefaultOperatorName>;\n\nexport type DefaultCombinators = StringUnionToFullOptionArray<DefaultCombinatorName>;\n\n/**\n * Default combinator list.\n *\n * @group Defaults\n */\n// #region docs-combinators\nexport const defaultCombinators: DefaultCombinators = [\n { name: 'and', value: 'and', label: 'AND' } as const,\n { name: 'or', value: 'or', label: 'OR' } as const,\n];\n// #endregion\n\nexport type DefaultCombinatorsExtended =\n StringUnionToFullOptionArray<DefaultCombinatorNameExtended>;\n\n/**\n * Default combinator list, with `XOR` added.\n *\n * @group Defaults\n */\nexport const defaultCombinatorsExtended: DefaultCombinatorsExtended = [\n ...defaultCombinators,\n { name: 'xor', value: 'xor', label: 'XOR' } as const,\n];\n\nexport type DefaultMatchModes = StringUnionToFullOptionArray<MatchMode>;\n\n/**\n * Default match modes.\n *\n * @group Defaults\n */\n// #region docs-matchmodes\nexport const defaultMatchModes: DefaultMatchModes = [\n { name: 'all', value: 'all', label: 'all' },\n { name: 'some', value: 'some', label: 'some' },\n { name: 'none', value: 'none', label: 'none' },\n { name: 'atLeast', value: 'atLeast', label: 'at least' },\n { name: 'atMost', value: 'atMost', label: 'at most' },\n { name: 'exactly', value: 'exactly', label: 'exactly' },\n];\n// #endregion\n\n/**\n * Standard classnames applied to each component.\n *\n * @group Defaults\n */\n// #region docs-standardclassnames\nexport const 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 matchMode: 'rule-matchMode',\n matchThreshold: 'rule-matchThreshold',\n operators: 'rule-operators',\n value: 'rule-value',\n removeRule: 'rule-remove',\n betweenRules: 'betweenRules',\n valid: 'queryBuilder-valid',\n invalid: 'queryBuilder-invalid',\n shiftActions: 'shiftActions',\n dndDragging: 'dndDragging',\n dndOver: 'dndOver',\n dndCopy: 'dndCopy',\n dndGroup: 'dndGroup',\n dndDropNotAllowed: 'dndDropNotAllowed',\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 justified: 'queryBuilder-justified',\n hasSubQuery: 'rule-hasSubQuery',\n} as const;\n// #endregion\n\n/**\n * Default classnames for each component.\n *\n * @group Defaults\n */\nexport const defaultControlClassnames: Classnames = {\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 matchMode: '',\n matchThreshold: '',\n operators: '',\n value: '',\n removeRule: '',\n shiftActions: '',\n dragHandle: '',\n lockRule: '',\n lockGroup: '',\n valueSource: '',\n actionElement: '',\n valueSelector: '',\n betweenRules: '',\n valid: '',\n invalid: '',\n dndDragging: '',\n dndOver: '',\n dndGroup: '',\n dndCopy: '',\n dndDropNotAllowed: '',\n disabled: '',\n valueListItem: '',\n branches: '',\n hasSubQuery: '',\n} satisfies Classnames;\n\n/**\n * Default reason codes for a group being invalid.\n *\n * @group Defaults\n */\nexport const groupInvalidReasons = {\n empty: 'empty',\n invalidCombinator: 'invalid combinator',\n invalidIndependentCombinators: 'invalid independent combinators',\n} as const;\n\n/**\n * Component identifiers for testing.\n *\n * @group Defaults\n */\nexport const 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 shiftActions: 'shift-actions',\n dragHandle: 'drag-handle',\n lockRule: 'lock-rule',\n lockGroup: 'lock-group',\n valueSourceSelector: 'value-source-selector',\n matchModeEditor: 'match-mode-editor',\n} as const;\n\nexport const 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 onGroupRuleFalse: 'onGroupRule callback returned false',\n onGroupGroupFalse: 'onGroupGroup callback returned false',\n onMoveRuleFalse: 'onMoveRule callback returned false',\n onMoveGroupFalse: 'onMoveGroup 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 group: 'rule or group grouped with another',\n} as const;\n\n/**\n * The {@link Path} of the root group.\n *\n * @group Defaults\n */\nexport const rootPath: Path = [] satisfies Path;\n","import { defaultJoinChar } from '../defaults';\n\n/**\n * Splits a string by a given character (see {@link defaultJoinChar}). Escaped characters\n * (characters preceded by a backslash) will not apply to the split, and the backslash will\n * be removed in the array element. Inverse of {@link joinWith}.\n *\n * @example\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,')\n * // or\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,', ',')\n * // would return\n * ['this,,that', '', 'the other', '', '', ',']\n */\nexport const splitBy = (str?: string, splitChar: string = defaultJoinChar): string[] =>\n typeof str === 'string'\n ? str\n .split(`\\\\${splitChar}`)\n .map(c => c.split(splitChar))\n .reduce((prev, curr, idx) => {\n if (idx === 0) {\n return curr;\n }\n return [...prev.slice(0, -1), `${prev.at(-1)}${splitChar}${curr[0]}`, ...curr.slice(1)];\n }, [])\n : [];\n\n/**\n * Joins an array of strings using the given character (see {@link defaultJoinChar}). When\n * the given character appears in an array element, a backslash will be added just before it\n * to distinguish it from the join character. Effectively the inverse of {@link splitBy}.\n *\n * TIP: The join character can actually be a string of any length. Only the first character\n * will be searched for in the array elements and preceded by a backslash.\n *\n * @example\n * joinWith(['this,,that', '', 'the other', '', '', ','], ', ')\n * // would return\n * 'this\\\\,\\\\,that, , the other, , , \\\\,'\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const joinWith = (strArr: any[], joinChar: string = defaultJoinChar): string =>\n strArr.map(str => `${str ?? ''}`.replaceAll(joinChar[0], `\\\\${joinChar[0]}`)).join(joinChar);\n\n/**\n * Trims the value if it is a string. Otherwise returns the value as is.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const trimIfString = (val: any): any => (typeof val === 'string' ? val.trim() : val);\n\n/**\n * Splits a string by comma then trims each element. Arrays are returned as is except\n * any string elements are trimmed.\n */\nexport const toArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n v: any,\n { retainEmptyStrings }: { retainEmptyStrings?: boolean } = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any[] =>\n Array.isArray(v)\n ? v.map(v => trimIfString(v))\n : typeof v === 'string'\n ? splitBy(v, defaultJoinChar)\n .filter(retainEmptyStrings ? () => true : s => !/^\\s*$/.test(s))\n .map(s => s.trim())\n : typeof v === 'number'\n ? [v]\n : [];\n\n/**\n * Determines if an array is free of `null`/`undefined`.\n */\nexport const nullFreeArray = <T>(arr: T[]): arr is Exclude<T, null>[] =>\n arr.every(el => el === false || (el ?? false) !== false);\n","// Adapted from https://github.com/lukeed/clsx/tree/925494cf31bcd97d3337aacd34e659e80cae7fe2\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ClassDictionary = Record<string, any>;\ntype ClassValue =\n | ClassArray\n | ClassDictionary\n | string\n | number\n | bigint\n | null\n | boolean\n | undefined;\ntype ClassArray = ClassValue[];\n\n// istanbul ignore next\n// oxlint-disable-next-line typescript/no-explicit-any\nfunction toVal(mix: any) {\n let k;\n let y;\n let str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n const len = mix.length;\n for (k = 0; k < len; k++) {\n if (mix[k] && (y = toVal(mix[k]))) {\n str && (str += ' ');\n str += y;\n }\n }\n } else {\n for (y in mix) {\n if (mix[y]) {\n str && (str += ' ');\n str += y;\n }\n }\n }\n }\n\n return str;\n}\n\n/**\n * Vendored/adapted version of the `clsx` package.\n *\n * **NOTE:** Prefer the official package from npm outside the context of React Query Builder.\n */\n// istanbul ignore next\nexport function clsx(...args: ClassValue[]): string {\n let i = 0;\n let tmp;\n let x;\n let str = '';\n const len = args.length;\n for (; i < len; i++) {\n if ((tmp = args[i]) && (x = toVal(tmp))) {\n str && (str += ' ');\n str += x;\n }\n }\n return str;\n}\n\nexport default clsx;\n","import { numericRegex as numericQuantityRegex } from 'numeric-quantity';\n\n/**\n * Converts a value to lowercase if it's a string, otherwise returns the value as is.\n */\n// istanbul ignore next\nexport const lc = <T>(v: T): T => (typeof v === 'string' ? (v.toLowerCase() as T) : v);\n\n/**\n * Regex matching numeric strings. Passes for positive/negative integers, decimals,\n * and E notation, with optional surrounding whitespace.\n */\nexport const numericRegex: RegExp = new RegExp(\n numericQuantityRegex.source.replace(/^\\^/, String.raw`^\\s*`).replace(/\\$$/, String.raw`\\s*$`)\n);\n\n/**\n * Determines if a variable is a plain old JavaScript object, aka POJO.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isPojo = (obj: any): obj is Record<string, any> =>\n obj === null || typeof obj !== 'object' ? false : Object.getPrototypeOf(obj) === Object.prototype;\n\n/**\n * Simple helper to determine whether a value is null, undefined, or an empty string.\n */\nexport const nullOrUndefinedOrEmpty = (value: unknown): value is null | undefined | '' =>\n value === null || value === undefined || value === '';\n","import type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is a {@link RuleType} (only checks for a `field` property).\n */\nexport const isRuleType = (s: unknown): s is RuleType =>\n isPojo(s) && 'field' in s && typeof s.field === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupType} or {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroup = (rg: unknown): rg is RuleGroupTypeAny =>\n isPojo(rg) && Array.isArray(rg.rules);\n\n/**\n * Determines if an object is a {@link RuleGroupType}.\n */\nexport const isRuleGroupType = (rg: unknown): rg is RuleGroupType =>\n isRuleGroup(rg) && typeof rg.combinator === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroupTypeIC = (rg: unknown): rg is RuleGroupTypeIC =>\n isRuleGroup(rg) && rg.combinator === undefined;\n","import { produce } from 'immer';\nimport type {\n RuleGroupArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { lc } from './misc';\n\nconst combinatorLevels = ['or', 'xor', 'and'] as const;\n\nconst isSameString = (a: unknown, b: string) => lc(a) === b;\n\nconst generateRuleGroupICWithConsistentCombinators = (\n rg: RuleGroupTypeIC,\n baseCombinatorLevel: number = 0\n): RuleGroupTypeIC => {\n const baseCombinator = combinatorLevels[baseCombinatorLevel];\n\n // oxlint-disable-next-line typescript/no-explicit-any\n if (!rg.rules.includes(baseCombinator as any)) {\n // No instances of this combinator, so group based on the next\n // combinator level if at least two levels remain\n return baseCombinatorLevel < combinatorLevels.length - 2\n ? generateRuleGroupICWithConsistentCombinators(rg, baseCombinatorLevel + 1)\n : rg;\n }\n\n return produce(rg, draft => {\n let cursor = 0;\n\n // Group all chains of combinators in the rule array that are not the base combinator\n while (cursor < draft.rules.length - 2) {\n if (isSameString(draft.rules[cursor + 1], baseCombinator)) {\n cursor += 2;\n continue;\n }\n\n const nextBaseCombinatorIndex = draft.rules.findIndex(\n (r, i) => i > cursor && typeof r === 'string' && lc(r) === baseCombinator\n );\n\n if (nextBaseCombinatorIndex === -1) {\n // No more instances of this combinator, so group all remaining rules and exit the loop\n draft.rules.splice(\n cursor,\n draft.rules.length,\n generateRuleGroupICWithConsistentCombinators(\n // oxlint-disable-next-line typescript/no-explicit-any\n { rules: draft.rules.slice(cursor) as any },\n baseCombinatorLevel + 1\n )\n );\n break;\n } else {\n // Group all rules between the current cursor and the next instance of the base combinator\n draft.rules.splice(\n cursor,\n nextBaseCombinatorIndex - cursor,\n generateRuleGroupICWithConsistentCombinators(\n // oxlint-disable-next-line typescript/no-explicit-any\n { rules: draft.rules.slice(cursor, nextBaseCombinatorIndex) as any },\n baseCombinatorLevel + 1\n )\n );\n }\n }\n });\n};\n\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}.\n *\n * This function is idempotent: {@link RuleGroupType} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertFromIC = <RG extends RuleGroupType = RuleGroupType>(\n rg: RuleGroupTypeAny\n): RG => {\n if (isRuleGroupType(rg)) {\n return rg as RG;\n }\n const processedRG = generateRuleGroupICWithConsistentCombinators(rg);\n const rulesAsMixedList = processedRG.rules.map(r =>\n typeof r === 'string' || !isRuleGroup(r) ? r : convertFromIC(r)\n );\n const combinator = rulesAsMixedList.length < 2 ? 'and' : (rulesAsMixedList[1] as string);\n const rules = rulesAsMixedList.filter(r => typeof r !== 'string') as RuleGroupArray;\n return { ...processedRG, combinator, rules } as RG;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}.\n *\n * This function is idempotent: {@link RuleGroupTypeIC} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertToIC = <RGIC extends RuleGroupTypeIC = RuleGroupTypeIC>(\n rg: RuleGroupTypeAny\n): RGIC => {\n if (isRuleGroupTypeIC(rg)) {\n return rg as RGIC;\n }\n const { combinator, ...queryWithoutCombinator } = rg;\n const rules: (RuleGroupTypeIC | RuleType | string)[] = [];\n const { length } = rg.rules;\n for (const [idx, r] of rg.rules.entries()) {\n if (isRuleGroup(r)) {\n rules.push(convertToIC(r));\n } else {\n rules.push(r);\n }\n if (combinator && idx < length - 1) {\n rules.push(combinator);\n }\n }\n return { ...queryWithoutCombinator, rules } as RGIC;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}. For a more explicit\n * operation, use {@link convertToIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupType): RuleGroupTypeIC;\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}. For a more explicit\n * operation, use {@link convertFromIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupTypeIC): RuleGroupType;\nfunction convertQuery(query: RuleGroupType | RuleGroupTypeIC): RuleGroupType | RuleGroupTypeIC {\n return isRuleGroupTypeIC(query) ? convertFromIC(query) : convertToIC(query);\n}\n\nexport { convertQuery };\n","import { defaultCombinators, groupInvalidReasons } from '../defaults';\nimport type { QueryValidator, RuleGroupTypeAny, RuleType, ValidationMap } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\n/**\n * This is an example validation function you can pass to {@link QueryBuilder} in the\n * `validator` prop. It assumes that you want to validate groups, and has a no-op\n * for validating rules which you can replace with your own implementation.\n */\nexport const defaultValidator: QueryValidator = query => {\n const result: ValidationMap = {};\n\n /**\n * Replace this with your custom rule validator.\n */\n const validateRule = (rule: RuleType) => {\n // Set `result[rule.id] = true` for a valid rule, or either\n // `{ valid: false, reasons: ['whatever', 'reasons', 'here'] }`\n // or simply `false` for an invalid rule.\n // istanbul ignore else\n if (rule.id) result[rule.id]; // = true;\n };\n\n const validateGroup = (rg: RuleGroupTypeAny) => {\n // oxlint-disable-next-line typescript/no-explicit-any\n const reasons: any[] = [];\n if (rg.rules.length === 0) {\n reasons.push(groupInvalidReasons.empty);\n } else if (!isRuleGroupType(rg)) {\n // Odd indexes should be valid combinators and even indexes should be rules or groups\n let invalidICs = false;\n for (let i = 0; i < rg.rules.length && !invalidICs; i++) {\n if (\n (i % 2 === 0 && typeof rg.rules[i] === 'string') ||\n (i % 2 === 1 && typeof rg.rules[i] !== 'string') ||\n (i % 2 === 1 &&\n typeof rg.rules[i] === 'string' &&\n !defaultCombinators.map(c => c.name as string).includes(rg.rules[i] as string))\n ) {\n invalidICs = true;\n }\n }\n if (invalidICs) {\n reasons.push(groupInvalidReasons.invalidIndependentCombinators);\n }\n }\n // Non-independent combinators should be valid, but only checked if there are multiple rules\n // since combinators don't really apply to groups with only one rule/group\n if (\n isRuleGroupType(rg) &&\n !defaultCombinators.map(c => c.name as string).includes(rg.combinator) &&\n rg.rules.length > 1\n ) {\n reasons.push(groupInvalidReasons.invalidCombinator);\n }\n /* istanbul ignore else */\n if (rg.id) {\n result[rg.id] = reasons.length > 0 ? { valid: false, reasons } : true;\n }\n for (const r of rg.rules) {\n if (typeof r === 'string') {\n // Validation for this case was done earlier\n } else if (isRuleGroup(r)) {\n validateGroup(r);\n } else {\n validateRule(r);\n }\n }\n };\n\n validateGroup(query);\n\n return result;\n // You can return the result object itself like above, or if you just\n // want the entire query to be marked invalid if _any_ rules/groups are\n // invalid, return a boolean like this:\n // return Object.values(result).map(rv => (typeof rv !== 'boolean')).includes(true);\n // That will return `true` if no errors were found.\n};\n","import type { Draft } from 'immer';\nimport { produce } from 'immer';\nimport type {\n BaseOption,\n BaseOptionMap,\n FlexibleOption,\n FlexibleOptionGroup,\n FlexibleOptionList,\n FullOption,\n FullOptionList,\n GetOptionIdentifierType,\n Option,\n OptionGroup,\n RequireAtLeastOne,\n ToFullOption,\n ValueOption,\n WithUnknownIndex,\n} from '../types';\nimport { isPojo } from './misc';\n\nconst isOptionWithName = (opt: BaseOption): opt is Option =>\n isPojo(opt) && 'name' in opt && typeof opt.name === 'string';\nconst isOptionWithValue = (opt: BaseOption): opt is ValueOption =>\n isPojo(opt) && 'value' in opt && typeof opt.value === 'string';\n\n/**\n * Converts an {@link Option} or {@link ValueOption} (i.e., {@link BaseOption})\n * into a {@link FullOption}. Full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOption<Opt extends BaseOption>(\n opt: Opt | string,\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): ToFullOption<Opt> {\n const recipe: (o: Opt | string) => ToFullOption<Opt> = produce(draft => {\n const idObj: { name?: string; value?: string } = {};\n let needsUpdating = !!baseProperties;\n\n if (typeof draft === 'string') {\n return {\n ...baseProperties,\n name: draft,\n value: draft,\n label: labelMap?.[draft] ?? draft,\n } as Draft<Opt>;\n }\n\n if (isOptionWithName(draft) && !isOptionWithValue(draft)) {\n idObj.value = draft.name;\n needsUpdating = true;\n } else if (!isOptionWithName(draft) && isOptionWithValue(draft)) {\n idObj.name = draft.value;\n needsUpdating = true;\n }\n\n if (needsUpdating) {\n return Object.assign({}, baseProperties, draft, idObj);\n }\n });\n return recipe(opt);\n}\n\n/**\n * Converts an {@link OptionList} or {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionList<Opt extends BaseOption>(\n optList: unknown[],\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): FullOptionList<Opt> {\n if (!Array.isArray(optList)) {\n return [] as unknown as FullOptionList<Opt>;\n }\n\n const recipe: (ol: FlexibleOptionList<Opt>) => FullOptionList<Opt> = produce(draft => {\n if (isFlexibleOptionGroupArray(draft)) {\n for (const optGroup of draft) {\n for (const [idx, opt] of optGroup.options.entries())\n optGroup.options[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n } else {\n for (const [idx, opt] of (draft as Opt[]).entries())\n draft[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n });\n\n return recipe(optList as FlexibleOptionList<Opt>);\n}\n\n/**\n * Converts a {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionMap<OptMap extends BaseOptionMap>(\n optMap: OptMap,\n baseProperties?: Record<string, unknown>\n): OptMap extends BaseOptionMap<infer V, infer K> ? Partial<Record<K, ToFullOption<V>>> : never {\n type FullOptMapType =\n OptMap extends BaseOptionMap<infer VT, infer KT>\n ? Partial<Record<KT, ToFullOption<VT>>>\n : never;\n\n return Object.fromEntries(\n (Object.entries(optMap) as [string, FlexibleOption][]).map(([k, v]) => [\n k,\n toFullOption(v, baseProperties),\n ])\n ) as FullOptMapType;\n}\n\n/**\n * @deprecated Renamed to {@link uniqByIdentifier}.\n *\n * @group Option Lists\n */\nexport const uniqByName = <\n T extends { name: string; value?: string } | { name?: string; value: string },\n>(\n originalArray: T[]\n): T[] => uniqByIdentifier(originalArray);\n\n/**\n * Generates a new array of objects with duplicates removed based\n * on the identifying property (`value` or `name`)\n *\n * @group Option Lists\n */\nexport const uniqByIdentifier = <\n T extends RequireAtLeastOne<{ name: string; value: string }, 'name' | 'value'>,\n>(\n originalArray: T[]\n): T[] => {\n const names = new Set<string>();\n const newArray: T[] = [];\n for (const el of originalArray) {\n if (!names.has((el.value ?? el.name)!)) {\n names.add((el.value ?? el.name)!);\n newArray.push(el);\n }\n }\n return originalArray.length === newArray.length ? originalArray : newArray;\n};\n\n/**\n * Determines if an {@link OptionList} is an {@link OptionGroup} array.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isOptionGroupArray = (arr: any): arr is OptionGroup<BaseOption>[] =>\n Array.isArray(arr) &&\n arr.length > 0 &&\n isPojo(arr[0]) &&\n 'options' in arr[0] &&\n Array.isArray(arr[0].options);\n\n/**\n * Determines if an array is a flat array of {@link FlexibleOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFlexibleOptionArray = (arr: any): arr is FlexibleOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) || isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if an array is a flat array of {@link FullOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFullOptionArray = (arr: any): arr is FullOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) && isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link FlexibleOptionGroup} array.\n *\n * @group Option Lists\n */\nexport const isFlexibleOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is FlexibleOptionGroup[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFlexibleOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link OptionGroup} array of {@link FullOption}.\n *\n * @group Option Lists\n */\nexport const isFullOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is OptionGroup<FullOption>[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFullOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Gets the option from an {@link OptionList} with the given `name`. Handles\n * {@link Option} arrays as well as {@link OptionGroup} arrays.\n *\n * @group Option Lists\n */\nexport function getOption<OptType extends FullOption>(\n arr: FullOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends ValueOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends Option>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends BaseOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined {\n const options = isFlexibleOptionGroupArray(arr, { allowEmpty: true })\n ? arr.flatMap(og => og.options)\n : arr;\n return options.find(op => op.value === name || op.name === name) as OptType | undefined;\n}\n\n/**\n * Gets the first option from an {@link OptionList}.\n *\n * @group Option Lists\n */\nexport function getFirstOption<Opt extends FullOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends ValueOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends Option>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends BaseOption>(\n arr?: FlexibleOptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null {\n if (!Array.isArray(arr) || arr.length === 0) {\n return null;\n } else if (isFlexibleOptionGroupArray(arr, { allowEmpty: true })) {\n for (const og of arr) {\n if (og.options.length > 0) {\n return (og.options[0].value ?? og.options[0].name) as GetOptionIdentifierType<Opt>;\n }\n }\n // istanbul ignore next\n return null;\n }\n\n return (arr[0].value ?? arr[0].name) as GetOptionIdentifierType<Opt>;\n}\n\n/**\n * Flattens {@link FlexibleOptionGroup} arrays into {@link BaseOption} arrays.\n * If the array is already flat, it is returned as is.\n *\n * @group Option Lists\n */\nexport const toFlatOptionArray = <T extends FullOption, OL extends FullOptionList<T>>(arr: OL) =>\n uniqByIdentifier(isOptionGroupArray(arr) ? arr.flatMap(og => og.options) : arr) as T[];\n\n/**\n * Generates a new {@link OptionGroup} array with duplicates\n * removed based on the identifying property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptGroups = <T extends BaseOption>(\n originalArray: FlexibleOptionGroup<T>[]\n): OptionGroup<ToFullOption<T>>[] => {\n type K = T extends BaseOption<infer KT> ? KT : never;\n const labels = new Set<string>();\n const names = new Set<K>();\n const newArray: OptionGroup<ToFullOption<T>>[] = [];\n for (const el of originalArray) {\n if (!labels.has(el.label)) {\n labels.add(el.label);\n const optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[] = [];\n for (const opt of el.options) {\n if (!names.has((opt.value ?? opt.name) as K)) {\n names.add((opt.value ?? opt.name) as K);\n optionsForThisGroup.push(toFullOption(opt) as WithUnknownIndex<ToFullOption<T>>);\n }\n }\n newArray.push({ ...el, options: optionsForThisGroup });\n }\n }\n return newArray;\n};\n\n/**\n * Generates a new {@link Option} or {@link OptionGroup} array with duplicates\n * removed based on the identifier property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptList = <T extends BaseOption>(\n originalArray: FlexibleOptionList<T>\n): WithUnknownIndex<BaseOption & FullOption>[] | OptionGroup<ToFullOption<T>>[] => {\n if (isFlexibleOptionGroupArray(originalArray)) {\n return uniqOptGroups(originalArray) as OptionGroup<ToFullOption<T>>[];\n }\n return uniqByIdentifier((originalArray as BaseOption[]).map(o => toFullOption(o)));\n};\n","import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import { numericQuantity } from 'numeric-quantity';\nimport type { ParseNumberMethod } from '../types';\n\n/**\n * Options object for {@link parseNumber}.\n */\nexport interface ParseNumberOptions {\n parseNumbers?: ParseNumberMethod;\n /**\n * Generates a `bigint` value if the string represents a valid integer\n * outside the safe boundaries of the `number` type.\n */\n bigIntOnOverflow?: boolean;\n}\n\n/**\n * Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is \"native\",\n * otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).\n * If that returns `NaN`, the string is returned unchanged. Numeric values are returned\n * as-is regardless of the `parseNumbers` option.\n */\nexport const parseNumber = (\n // oxlint-disable-next-line typescript/no-explicit-any\n val: any,\n { parseNumbers, bigIntOnOverflow }: ParseNumberOptions = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any => {\n if (!parseNumbers || typeof val === 'bigint' || typeof val === 'number') {\n return val;\n }\n\n if (parseNumbers === 'native') {\n return Number.parseFloat(val);\n }\n\n const valAsNum: number | bigint =\n // TODO: Should these options be configurable?\n numericQuantity(val, {\n allowTrailingInvalid: parseNumbers === 'enhanced',\n bigIntOnOverflow,\n romanNumerals: false,\n round: false,\n });\n\n return typeof valAsNum === 'bigint' || !Number.isNaN(valAsNum) ? valAsNum : val;\n};\n","/**\n * Recursively steps through a query object ({@link index!RuleGroupType RuleGroupType} or {@link index!RuleGroupTypeIC RuleGroupTypeIC}),\n * passing each {@link index!RuleType RuleType} object to a provided `ruleProcessor` function and returning a\n * new query object if there were any referential changes.\n *\n * @module transformQuery\n */\n\nimport { produce } from 'immer';\nimport type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\nconst remapProperties = (\n // oxlint-disable-next-line typescript/no-explicit-any\n obj: Record<string, any>,\n propertyMap: Record<string, string | false>,\n deleteRemappedProperties: boolean\n) =>\n produce(obj, draft => {\n for (const [k, v] of Object.entries(propertyMap)) {\n if (v === false) {\n delete draft[k];\n } else if (!!v && k !== v && k in draft) {\n draft[v] = draft[k];\n if (deleteRemappedProperties) {\n delete draft[k];\n }\n }\n }\n });\n\n/**\n * Options object for {@link index!transformQuery transformQuery}.\n */\nexport interface TransformQueryOptions<RG extends RuleGroupTypeAny = RuleGroupType> {\n /**\n * When a rule is encountered in the hierarchy, it will be replaced\n * with the result of this function.\n *\n * @defaultValue `r => r`\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n ruleProcessor?: (rule: RuleType) => any;\n /**\n * When a group is encountered in the hierarchy (including the root group, the\n * query itself), it will be replaced with the result of this function.\n *\n * @defaultValue `rg => rg`\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n ruleGroupProcessor?: (ruleGroup: RG) => Record<string, any>;\n /**\n * For each rule and group in the query, any properties matching a key\n * in this object will be renamed to the corresponding value. To retain both\n * the new _and_ the original properties, set `deleteRemappedProperties`\n * to `false`.\n *\n * If a key has a value of `false`, the corresponding property will be removed\n * without being copied to a new property name. (Warning: `{ rules: false }`\n * will prevent recursion and only return the processed root group.)\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', not: true, rules: [] },\n * { propertyMap: { combinator: 'AndOr', not: false } }\n * )\n * // Returns: { AndOr: 'and', rules: [] }\n * ```\n */\n propertyMap?: Record<string, string | false>;\n /**\n * Any combinator values (including independent combinators) will be translated\n * from the key in this object to the value.\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [] },\n * { combinatorMap: { and: '&&', or: '||' } }\n * )\n * // Returns: { combinator: '&&', rules: [] }\n * ```\n */\n combinatorMap?: Record<string, string>;\n /**\n * Any operator values will be translated from the key in this object to the value.\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [{ field: 'name', operator: '=', value: 'Steve Vai' }] },\n * { operatorMap: { '=': 'is' } }\n * )\n * // Returns:\n * // {\n * // combinator: 'and',\n * // rules: [{ field: 'name', operator: 'is', value: 'Steve Vai' }]\n * // }\n * ```\n */\n operatorMap?: Record<string, string>;\n /**\n * Prevents the `path` property (see {@link index!Path Path}) from being added to each\n * rule and group in the hierarchy.\n *\n * @defaultValue `false`\n */\n omitPath?: boolean;\n /**\n * Original properties remapped according to the `propertyMap` option will be removed.\n *\n * @defaultValue `true`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [] },\n * { propertyMap: { combinator: 'AndOr' }, deleteRemappedProperties: false }\n * )\n * // Returns: { combinator: 'and', AndOr: 'and', rules: [] }\n * ```\n */\n deleteRemappedProperties?: boolean;\n}\n\n/**\n * Recursively process a query heirarchy using this versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n query: RuleGroupType,\n options?: TransformQueryOptions\n // oxlint-disable-next-line typescript/no-explicit-any\n): any;\n/**\n * Recursively process a query heirarchy with independent combinators using this\n * versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n query: RuleGroupTypeIC,\n options?: TransformQueryOptions<RuleGroupTypeIC>\n // oxlint-disable-next-line typescript/no-explicit-any\n): any;\nexport function transformQuery<RG extends RuleGroupTypeAny>(\n query: RG,\n options: TransformQueryOptions<RG> = {}\n) {\n const {\n ruleProcessor = r => r,\n ruleGroupProcessor = rg => rg,\n propertyMap = {},\n combinatorMap = {},\n operatorMap = {},\n omitPath = false,\n deleteRemappedProperties = true,\n } = options;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processGroup = (rg: RuleGroupTypeAny): any => ({\n ...ruleGroupProcessor(\n remapProperties(\n {\n ...rg,\n ...(isRuleGroupType(rg)\n ? { combinator: combinatorMap[rg.combinator] ?? rg.combinator }\n : {}),\n },\n propertyMap,\n deleteRemappedProperties\n ) as RG\n ),\n ...(propertyMap['rules'] === false\n ? null\n : {\n // oxlint-disable-next-line typescript/no-explicit-any\n [propertyMap['rules'] ?? 'rules']: rg.rules.map((r: any, idx) => {\n const pathObject = omitPath ? null : { path: [...rg.path!, idx] };\n if (typeof r === 'string') {\n // independent combinators\n return combinatorMap[r] ?? r;\n } else if (isRuleGroup(r)) {\n // sub-groups\n return processGroup({ ...r, ...pathObject });\n }\n // rules\n return ruleProcessor(\n remapProperties(\n {\n ...r,\n ...pathObject,\n ...('operator' in r ? { operator: operatorMap[r.operator] ?? r.operator } : {}),\n },\n propertyMap,\n deleteRemappedProperties\n ) as RuleType\n );\n }),\n }),\n });\n\n return processGroup({ ...query, ...(omitPath ? null : { path: [] }) });\n}\n","import type { RuleGroupTypeAny, RuleType, RuleValidator, ValidationResult } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is useful as a validation result.\n */\nexport const isValidationResult = (vr?: ValidationResult): vr is ValidationResult =>\n isPojo(vr) && typeof vr.valid === 'boolean';\n\n/**\n * Determines if a rule or group is valid based on a validation result (if defined)\n * or a validator function. Returns `true` if neither are defined.\n */\nexport const isRuleOrGroupValid = (\n rg: RuleType | RuleGroupTypeAny,\n validationResult?: boolean | ValidationResult,\n validator?: RuleValidator\n): boolean => {\n if (typeof validationResult === 'boolean') {\n return validationResult;\n }\n if (isValidationResult(validationResult)) {\n return validationResult.valid;\n }\n if (typeof validator === 'function' && !isRuleGroup(rg)) {\n const vr = validator(rg);\n if (typeof vr === 'boolean') {\n return vr;\n }\n // istanbul ignore else\n if (isValidationResult(vr)) {\n return vr.valid;\n }\n }\n return true;\n};\n","import type { InputType, ParseNumberMethod, ParseNumbersPropConfig } from '../types';\n\nexport const getParseNumberMethod = ({\n parseNumbers,\n inputType,\n}: {\n parseNumbers?: ParseNumbersPropConfig;\n inputType?: InputType | null;\n}): ParseNumberMethod => {\n if (typeof parseNumbers === 'string') {\n const [method, level] = parseNumbers.split('-') as\n | [ParseNumberMethod, 'limited']\n | [ParseNumberMethod];\n if (level === 'limited') {\n return inputType === 'number' ? method : false;\n }\n\n return method;\n }\n\n return parseNumbers ? 'strict' : false;\n};\n","import type {\n ConstituentWordOrder,\n DefaultCombinatorName,\n FormatQueryOptions,\n FullField,\n GroupVariantCondition,\n MatchMode,\n NLTranslationKey,\n NLTranslations,\n OptionList,\n RuleGroupTypeAny,\n RuleType,\n SetRequired,\n ValueProcessorByRule,\n ValueProcessorLegacy,\n ValueProcessorOptions,\n} from '../../types';\nimport { joinWith, splitBy, toArray } from '../arrayUtils';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isPojo, lc, numericRegex } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { parseNumber } from '../parseNumber';\n\n/**\n * Maps a {@link DefaultOperatorName} to a SQL operator.\n *\n * @group Export\n */\nexport const mapSQLOperator = (rqbOperator: string): string => {\n switch (lc(rqbOperator)) {\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 rqbOperator;\n }\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a MongoDB operator.\n *\n * @group Export\n */\nexport const mongoOperators = {\n '=': '$eq',\n '!=': '$ne',\n '<': '$lt',\n '<=': '$lte',\n '>': '$gt',\n '>=': '$gte',\n in: '$in',\n notin: '$nin',\n notIn: '$nin', // only here for backwards compatibility\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a Prisma ORM operator.\n *\n * @group Export\n */\nexport const prismaOperators = {\n '=': 'equals',\n '!=': 'not',\n '<': 'lt',\n '<=': 'lte',\n '>': 'gt',\n '>=': 'gte',\n in: 'in',\n notin: 'notIn',\n};\n\n/**\n * Maps a {@link DefaultCombinatorName} to a CEL combinator.\n *\n * @group Export\n */\nexport const celCombinatorMap: {\n and: '&&';\n or: '||';\n} = {\n and: '&&',\n or: '||',\n} satisfies Record<DefaultCombinatorName, '&&' | '||'>;\n\n/**\n * Register these operators with `jsonLogic` before applying the result\n * of `formatQuery(query, 'jsonlogic')`.\n *\n * @example\n * ```\n * for (const [op, func] of Object.entries(jsonLogicAdditionalOperators)) {\n * jsonLogic.add_operation(op, func);\n * }\n * jsonLogic.apply({ \"startsWith\": [{ \"var\": \"firstName\" }, \"Stev\"] }, data);\n * ```\n *\n * @group Export\n */\nexport const jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n> = {\n startsWith: (a: string, b: string) => typeof a === 'string' && a.startsWith(b),\n endsWith: (a: string, b: string) => typeof a === 'string' && a.endsWith(b),\n};\n\n/**\n * Converts all `string`-type `value` properties of a query object into `number` where appropriate.\n *\n * Used by {@link formatQuery} for the `json*` formats when `parseNumbers` is `true`.\n *\n * @group Export\n */\nexport const numerifyValues = (\n rg: RuleGroupTypeAny,\n options: SetRequired<FormatQueryOptions, 'fields'>\n): RuleGroupTypeAny => ({\n ...rg,\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\n if (isRuleGroup(r)) {\n return numerifyValues(r, options);\n }\n\n const fieldData = getOption(options.fields as OptionList<FullField>, r.field);\n const parseNumbers = getParseNumberMethod({\n parseNumbers: options.parseNumbers,\n inputType: fieldData?.inputType,\n });\n\n if (Array.isArray(r.value)) {\n return { ...r, value: r.value.map(v => parseNumber(v, { parseNumbers })) };\n }\n\n const valAsArray = toArray(r.value, { retainEmptyStrings: true }).map(v =>\n parseNumber(v, { parseNumbers })\n );\n if (valAsArray.every(v => typeof v === 'number')) {\n // istanbul ignore else\n if (valAsArray.length > 1) {\n return { ...r, value: valAsArray };\n } else if (valAsArray.length === 1) {\n return { ...r, value: valAsArray[0] };\n }\n }\n\n return r;\n }),\n});\n\n/**\n * Determines whether a value is _anything_ except an empty `string` or `NaN`.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isValidValue = (value: any): boolean =>\n (typeof value === 'string' && value.length > 0) ||\n (typeof value === 'number' && !Number.isNaN(value)) ||\n (typeof value !== 'string' && typeof value !== 'number');\n\n/**\n * Determines whether {@link formatQuery} should render the given value as a number.\n * As long as `parseNumbers` is `true`, `number` and `bigint` values will return `true` and\n * `string` values will return `true` if they test positive against {@link numericRegex}.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const shouldRenderAsNumber = (value: any, parseNumbers?: boolean): boolean =>\n !!parseNumbers &&\n (typeof value === 'number' ||\n typeof value === 'bigint' ||\n (typeof value === 'string' && numericRegex.test(value)));\n\n/**\n * Used by {@link formatQuery} to determine whether the given value processor is a\n * \"legacy\" value processor by counting the number of arguments. Legacy value\n * processors take 3 arguments (not counting any arguments with default values), while\n * rule-based value processors take no more than 2 arguments.\n *\n * @group Export\n */\nexport const isValueProcessorLegacy = (\n valueProcessor: ValueProcessorLegacy | ValueProcessorByRule\n): valueProcessor is ValueProcessorLegacy => valueProcessor.length >= 3;\n\n/**\n * Converts the `quoteFieldNamesWith` option into an array of two strings.\n * If the option is a string, the array elements are both that string.\n *\n * @default\n * ['', '']\n *\n * @group Export\n */\nexport const getQuoteFieldNamesWithArray = (\n // istanbul ignore next\n quoteFieldNamesWith: null | string | [string, string] = ['', '']\n): [string, string] =>\n Array.isArray(quoteFieldNamesWith)\n ? quoteFieldNamesWith\n : typeof quoteFieldNamesWith === 'string'\n ? [quoteFieldNamesWith, quoteFieldNamesWith]\n : (quoteFieldNamesWith ?? ['', '']);\n\n/**\n * Given a field name and relevant {@link ValueProcessorOptions}, returns the field name\n * wrapped in the configured quote character(s).\n *\n * @group Export\n */\nexport const getQuotedFieldName = (\n fieldName: string,\n { quoteFieldNamesWith, fieldIdentifierSeparator }: ValueProcessorOptions\n): string => {\n const [qPre, qPost] = getQuoteFieldNamesWithArray(quoteFieldNamesWith);\n return typeof fieldIdentifierSeparator === 'string' && fieldIdentifierSeparator.length > 0\n ? joinWith(\n splitBy(fieldName, fieldIdentifierSeparator).map(part => `${qPre}${part}${qPost}`),\n fieldIdentifierSeparator\n )\n : `${qPre}${fieldName}${qPost}`;\n};\n\nconst defaultWordOrder = ['S', 'V', 'O'];\n\n/**\n * Given a [Constituent word order](https://en.wikipedia.org/wiki/Word_order#Constituent_word_orders)\n * like \"svo\" or \"sov\", returns a permutation of `[\"S\", \"V\", \"O\"]` based on the first occurrence of\n * each letter in the input string (case insensitive). This widens the valid input from abbreviations\n * like \"svo\" to more expressive strings like \"subject-verb-object\" or \"sub ver obj\". Any missing\n * letters are appended in the default order \"SVO\" (e.g., \"object\" would yield `[\"O\", \"S\", \"V\"]`).\n *\n * @group Export\n */\nexport const normalizeConstituentWordOrder = (input: string): ConstituentWordOrder => {\n const result: string[] = [];\n const letterSet = new Set(defaultWordOrder);\n\n for (const char of input.toUpperCase()) {\n if (letterSet.has(char)) {\n result.push(char);\n letterSet.delete(char);\n if (letterSet.size === 0) break;\n }\n }\n\n // Add any missing letters in default order\n for (const letter of defaultWordOrder) {\n if (letterSet.has(letter)) {\n result.push(letter);\n }\n }\n\n return result as ConstituentWordOrder;\n};\n\n/**\n * Default translations used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\n// The ones commented below are unnecessary for the default implementation,\n// but they can be overridden for customized implementations.\nexport const defaultNLTranslations: NLTranslations = {\n // and: 'and',\n // or: 'or',\n // true: 'true',\n // false: 'false',\n groupPrefix: '',\n // groupPrefix_not: '',\n groupPrefix_not_xor: 'either zero or more than one of',\n groupPrefix_xor: 'exactly one of',\n groupSuffix: 'is true',\n groupSuffix_not: 'is not true',\n // groupSuffix_not_xor: 'is true',\n // groupSuffix_xor: 'is true',\n};\n\n/**\n * Note: This function assumes `conditions.length > 0`\n */\nconst translationMatchFilter = (\n key: NLTranslationKey,\n keyToTest: string,\n conditions: GroupVariantCondition[]\n) =>\n // The translation matches the base key\n keyToTest.startsWith(key) &&\n // The translation specifies all conditions\n conditions.every(\n c =>\n // This translation specifies _this_ condition\n keyToTest.includes(`_${c}`) &&\n // This translation specifies the same _total number_ of conditions\n keyToTest.match(/_/g)?.length === conditions.length\n );\n\n/**\n * Used by {@link formatQuery} to get a translation based on certain conditions\n * for the \"natural_language\" format.\n *\n * @group Export\n */\nexport const getNLTranslataion = (\n key: NLTranslationKey,\n translations: NLTranslations,\n conditions: GroupVariantCondition[] = []\n): string =>\n conditions.length === 0\n ? (translations[key] ?? defaultNLTranslations[key] ?? /* istanbul ignore next */ '')\n : (Object.entries(translations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n Object.entries(defaultNLTranslations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n defaultNLTranslations[key] ??\n /* istanbul ignore next */ '');\n\ntype ProcessedMatchMode =\n | { mode: 'all'; threshold?: number | null | undefined }\n | { mode: 'none'; threshold?: number | null | undefined }\n | { mode: 'some'; threshold?: number | null | undefined }\n | { mode: 'atleast'; threshold: number }\n | { mode: 'atmost'; threshold: number }\n | { mode: 'exactly'; threshold: number };\n\nexport const processMatchMode = (rule: RuleType): void | false | ProcessedMatchMode => {\n const { mode, threshold } = rule.match ?? {};\n\n if (mode) {\n if (!isRuleGroup(rule.value)) return false;\n\n const matchModeLC = lc(mode) as Lowercase<MatchMode>;\n\n const matchModeCoerced =\n matchModeLC === 'atleast' && threshold === 1\n ? 'some'\n : matchModeLC === 'atmost' && threshold === 0\n ? 'none'\n : matchModeLC;\n\n if (\n (matchModeCoerced === 'atleast' ||\n matchModeCoerced === 'atmost' ||\n matchModeCoerced === 'exactly') &&\n (typeof threshold !== 'number' || threshold < 0)\n ) {\n return false;\n }\n\n return { mode: matchModeCoerced, threshold: threshold! };\n }\n};\n\n/**\n * \"Replacer\" method for JSON.stringify's second argument. Converts `bigint` values to\n * objects with a `$bigint` property having a value of a string representation of\n * the actual `bigint`-type value.\n *\n * Inverse of {@link bigIntJsonParseReviver}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonStringifyReplacer = (_key: string, value: unknown): unknown =>\n typeof value === 'bigint' ? { $bigint: value.toString() } : value;\n\n/**\n * \"Reviver\" method for JSON.parse's second argument. Converts objects having a single\n * `$bigint: string` property to an actual `bigint` value.\n *\n * Inverse of {@link bigIntJsonStringifyReplacer}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonParseReviver = (_key: string, value: unknown): unknown =>\n isPojo(value) && Object.keys(value).length === 1 && typeof value.$bigint === 'string'\n ? BigInt(value.$bigint)\n : value;\n","import type { DefaultCombinatorName, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { celCombinatorMap } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorCEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const expression: string = rg.rules\n .map(rule => {\n if (typeof rule === 'string') {\n return celCombinatorMap[rule as DefaultCombinatorName];\n }\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean)\n .join(\n isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator as DefaultCombinatorName]} ` : ' '\n );\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeDoubleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorCEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const celQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: `${arrayElementAlias}${r.field ? `.${r.field}` : ''}` }),\n });\n const nestedArrayFilter = defaultRuleGroupProcessorCEL(\n celQuery,\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'none':\n case 'some':\n return `${mode === 'none' ? '!' : ''}${field}.exists(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const totalCount = `double(${field}.size())`;\n const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;\n\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n }`;\n\n case 'contains':\n case 'doesnotcontain': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.contains(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.startsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.endsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const [prefix, suffix] = shouldNegate(operatorTL) ? ['!(', ')'] : ['', ''];\n const valueAsArray = toArray(value);\n return `${prefix}${field} in [${valueAsArray\n .map(val =>\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n )\n .join(', ')}]${suffix}`;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"`\n : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} && ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const mongoDbFallback = { $and: [{ $expr: true }] } as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? mongoDbFallback : false;\n }\n\n const combinator = `$${lc(rg.combinator)}`;\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return false;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : mongoDbFallback;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorMongoDBQuery } from './defaultRuleGroupProcessorMongoDBQuery';\nimport { isValidValue, mongoOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers = false) =>\n shouldRenderAsNumber(value, parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: 'strict' }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDBQuery: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder, context } = options;\n const valueIsField = valueSource === 'field';\n\n const { avoidFieldsAsKeys } = (context ?? {}) as { avoidFieldsAsKeys?: boolean };\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = { $size: { $ifNull: [`$${field}`, []] } };\n const subQueryNoAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `${field}.${r.field}` : field }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: false },\n }\n );\n const subQueryWithAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$item.${r.field}` : '$item' }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: true },\n }\n );\n\n const filteredCount = {\n $size: {\n $ifNull: [\n { $filter: { input: `$${field}`, as: 'item', cond: { $and: [subQueryWithAggCtx] } } },\n [],\n ],\n },\n };\n\n switch (mode) {\n case 'all':\n return { $expr: { $eq: [filteredCount, totalCount] } };\n\n case 'none':\n return { $nor: [subQueryNoAggCtx] };\n\n case 'some':\n return subQueryNoAggCtx;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op =\n mode === 'atleast'\n ? mongoOperators['>=']\n : mode === 'atmost'\n ? mongoOperators['<=']\n : mongoOperators['='];\n\n if (threshold > 0 && threshold < 1) {\n return { $expr: { [op]: [filteredCount, { $multiply: [totalCount, threshold] }] } };\n }\n return { $expr: { [op]: [filteredCount, threshold] } };\n }\n }\n }\n\n if (operator === '=' && !valueIsField) {\n return avoidFieldsAsKeys\n ? { $eq: [`$${field}`, processNumber(value, value, parseNumbers)] }\n : { [field]: processNumber(value, value, parseNumbers) };\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=': {\n const mongoOperator = mongoOperators[operatorLC];\n return valueIsField\n ? { [mongoOperator]: [`$${field}`, `$${value}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [\n { $ne: [`$${field}`, null] },\n { [mongoOperator]: [`$${field}`, processNumber(value, value, parseNumbers)] },\n ],\n }\n : { [field]: { [mongoOperator]: processNumber(value, value, parseNumbers) } };\n }\n\n case 'contains':\n return valueIsField\n ? { $where: `this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: value } }\n : { [field]: { $regex: value } };\n\n case 'beginswith':\n return valueIsField\n ? { $where: `this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `^${value}` } }\n : { [field]: { $regex: `^${value}` } };\n\n case 'endswith':\n return valueIsField\n ? { $where: `this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `${value}$` } }\n : { [field]: { $regex: `${value}$` } };\n\n case 'doesnotcontain':\n return valueIsField\n ? { $where: `!this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: value } } }\n : { [field]: { $not: { $regex: value } } };\n\n case 'doesnotbeginwith':\n return valueIsField\n ? { $where: `!this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `^${value}` } } }\n : { [field]: { $not: { $regex: `^${value}` } } };\n\n case 'doesnotendwith':\n return valueIsField\n ? { $where: `!this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `${value}$` } } }\n : { [field]: { $not: { $regex: `${value}$` } } };\n\n case 'null':\n return avoidFieldsAsKeys ? { $eq: [`$${field}`, null] } : { [field]: null };\n\n case 'notnull':\n return avoidFieldsAsKeys ? { $ne: [`$${field}`, null] } : { [field]: { $ne: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return valueIsField\n ? {\n $where: `${operatorLC === 'notin' ? '!' : ''}[${valueAsArray\n .map(val => `this.${val}`)\n .join(',')}].includes(this.${field})`,\n }\n : avoidFieldsAsKeys\n ? operatorLC === 'notin'\n ? {\n $not: {\n [mongoOperators.in]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n },\n }\n : {\n [mongoOperators[operatorLC]]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n }\n : {\n [field]: {\n [mongoOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n const firstNum = processNumber(first, Number.NaN, true);\n const secondNum = processNumber(second, Number.NaN, true);\n let firstValue = valueIsField ? first : Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = valueIsField ? second : Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n if (operatorLC === 'between') {\n return valueIsField\n ? { $gte: [`$${field}`, `$${firstValue}`], $lte: [`$${field}`, `$${secondValue}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [{ $gte: [`$${field}`, firstValue] }, { $lte: [`$${field}`, secondValue] }],\n }\n : { [field]: { $gte: firstValue, $lte: secondValue } };\n } else {\n return valueIsField\n ? {\n $or: [\n { $lt: [`$${field}`, `$${firstValue}`] },\n { $gt: [`$${field}`, `$${secondValue}`] },\n ],\n }\n : avoidFieldsAsKeys\n ? {\n $or: [{ $lt: [`$${field}`, firstValue] }, { $gt: [`$${field}`, secondValue] }],\n }\n : { $or: [{ [field]: { $lt: firstValue } }, { [field]: { $gt: secondValue } }] };\n }\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleProcessor } from '../../types';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDB: RuleProcessor = (rule, options) => {\n const queryObj = defaultRuleProcessorMongoDBQuery(rule, options);\n return queryObj ? JSON.stringify(queryObj) : '';\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const expression: string = rg.rules\n .map(rule => {\n if (typeof rule === 'string') {\n return rule;\n }\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean)\n .join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\nconst wrapInNegation = (clause: string, negate: boolean) => (negate ? `!(${clause})` : clause);\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeSingleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\\\'`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSpEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorSpEL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field || '#this' }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n const totalCount = `${field}.size()`;\n const filteredCount = `${field}.?[${nestedArrayFilter}].size()`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} == ${totalCount}`;\n\n case 'none':\n return `${filteredCount} == 0`;\n\n case 'some':\n return `${filteredCount} >= 1`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return wrapInNegation(\n `${field} matches ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`,\n shouldNegate(operatorTL)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const valueTL = valueIsField\n ? `'^'.concat(${trimIfString(value)})`\n : `'${\n (typeof value === 'string' && !value.startsWith('^')) || useBareValue ? '^' : ''\n }${escapeSingleQuotes(value, escapeQuotes)}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const valueTL = valueIsField\n ? `${trimIfString(value)}.concat('$')`\n : `'${escapeSingleQuotes(value, escapeQuotes)}${\n (typeof value === 'string' && !value.endsWith('$')) || useBareValue ? '$' : ''\n }'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n const valueAsArray = toArray(value);\n return valueAsArray.length > 0\n ? `${negate}(${valueAsArray\n .map(\n val =>\n `${field} == ${\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `'${escapeSingleQuotes(val, escapeQuotes)}'`\n }`\n )\n .join(' or ')})`\n : '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility in SpEL format, between operators should parse numbers\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `'${escapeSingleQuotes(first, escapeQuotes)}'`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `'${escapeSingleQuotes(second, escapeQuotes)}'`\n : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} and ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n\n return '';\n};\n","import type { ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeStringValueQuotes = (v: any, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorByRule: ValueProcessorByRule = (\n { operator, value, valueSource },\n // istanbul ignore next - defaultRuleProcessorSQL always provides options\n {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith,\n quoteValuesWith,\n concatOperator = '||',\n fieldIdentifierSeparator,\n wrapValueWith = ['', ''],\n translations,\n } = {}\n) => {\n const valueIsField = valueSource === 'field';\n const operatorLowerCase = lc(operator);\n const quoteChar = quoteValuesWith || \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) =>\n `${wrapValueWith[0]}${quoteChar}${v}${quoteChar}${wrapValueWith[1]}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n const concat = (...values: string[]) =>\n concatOperator.toUpperCase() === 'CONCAT'\n ? `CONCAT(${values.join(', ')})`\n : values.join(` ${concatOperator} `);\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `(${valueAsArray\n .map(v =>\n valueIsField\n ? wrapFieldName(v)\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n )\n .join(', ')})`;\n }\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n const secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : second\n : secondNum;\n\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return (\n (\n valueIsField\n ? valsOneAndTwoOnly.map(v => wrapFieldName(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly.map(v => wrapAndEscape(v))\n )\n // Note: `translations` should not be used for SQL.\n // This is only here to support the \"natural_language\" format.\n .join(` ${translations?.and ?? 'and'} `)\n );\n }\n\n case 'contains':\n case 'doesnotcontain':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value), quoteValue('%'))\n : quoteValue(`%${escapeValue(value)}%`);\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return valueIsField\n ? concat(wrapFieldName(value), quoteValue('%'))\n : quoteValue(`${escapeValue(value)}%`);\n\n case 'endswith':\n case 'doesnotendwith':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value))\n : quoteValue(`%${escapeValue(value)}`);\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n return valueIsField\n ? wrapFieldName(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? `${trimIfString(value)}`\n : `${wrapAndEscape(value)}`;\n};\n","import type { Column, Operators, SQL, SQLWrapper } from 'drizzle-orm';\nimport type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"drizzle\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorDrizzle: RuleProcessor = (rule, _options): SQL | undefined => {\n const opts = _options ?? /* istanbul ignore next */ {};\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder, context = {} } = opts;\n const { columns, drizzleOperators, useRawFields } = context as {\n columns: Record<string, Column>;\n drizzleOperators: Operators;\n useRawFields?: boolean;\n };\n\n if (!columns || !drizzleOperators) return;\n\n const {\n between,\n eq,\n gt,\n gte,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n notBetween,\n notInArray,\n notLike,\n sql,\n } = drizzleOperators;\n\n const { field, operator, value, valueSource } = rule;\n // TODO: Improve field validation\n const column =\n useRawFields && /[a-z][a-z0-9]*/i.test(field)\n ? (sql.raw(field) as Exclude<SQLWrapper, SQL.Aliased | Column>)\n : columns[field];\n const operatorLC = lc(operator);\n\n const valueIsField = valueSource === 'field';\n const asFieldOrValue = (v: string) => (valueIsField ? columns[v] : v);\n\n if (!column) return;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts.preset !== 'postgresql') return;\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const sqlQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n });\n\n const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {\n ...(opts as FormatQueryFinalOptions),\n context: { ...opts.context, useRawFields: true },\n });\n\n switch (mode) {\n case 'all':\n return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;\n\n case 'none':\n return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'some':\n return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return threshold > 0 && threshold < 1\n ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`\n : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;\n }\n }\n }\n\n switch (operatorLC) {\n case '=':\n return eq(column, asFieldOrValue(value));\n case '!=':\n return ne(column, asFieldOrValue(value));\n case '>':\n return gt(column, asFieldOrValue(value));\n case '<':\n return lt(column, asFieldOrValue(value));\n case '>=':\n return gte(column, asFieldOrValue(value));\n case '<=':\n return lte(column, asFieldOrValue(value));\n case 'beginswith':\n case 'doesnotbeginwith':\n return (operatorLC === 'doesnotbeginwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`\n );\n case 'contains':\n case 'doesnotcontain':\n return (operatorLC === 'doesnotcontain' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`\n );\n case 'endswith':\n case 'doesnotendwith':\n return (operatorLC === 'doesnotendwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`\n );\n case 'null':\n return isNull(column);\n case 'notnull':\n return isNotNull(column);\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => asFieldOrValue(v));\n return operatorLC === 'notin'\n ? notInArray(column, valueAsArray)\n : inArray(column, valueAsArray);\n }\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else {\n // istanbul ignore else\n if (valueIsField) {\n first = asFieldOrValue(first);\n second = asFieldOrValue(second);\n }\n }\n return operatorLC === 'notbetween'\n ? notBetween(column, first, second)\n : between(column, first, second);\n }\n return;\n }\n default:\n return;\n }\n};\n","import type { Column, Operators, SQL, Table } from 'drizzle-orm';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\n\n/**\n * Default rule group processor used by {@link formatQuery} for the \"drizzle\" format. The returned\n * function can be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @example\n * const where = formatQuery(query, 'drizzle');\n * const results = db.query.users.findMany({ where });\n *\n * @returns Function that takes a Drizzle table config and an object of Drizzle operators.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n> =\n (ruleGroup, options, _meta) =>\n (columns: Table | Record<string, Column>, drizzleOperators: Operators) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n validateRule,\n validationMap,\n } = options;\n\n if (!columns || !drizzleOperators) return;\n\n const { and, not, or } = drizzleOperators;\n\n const query = isRuleGroupType(ruleGroup) ? ruleGroup : convertFromIC(ruleGroup);\n const ruleProcessor = defaultRuleProcessorDrizzle;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): SQL | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n context: { ...options.context, columns, drizzleOperators },\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return;\n }\n\n const ruleGroupSQL: SQL | undefined =\n rg.combinator === 'or' ? or(...processedRules)! : and(...processedRules)!;\n\n return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;\n };\n\n return processRuleGroup(query, true);\n };\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processRuleGroup = (rg: RuleGroupType): Record<string, any> | false => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n return {\n bool: rg.not\n ? {\n must_not: /^or$/i.test(rg.combinator)\n ? { bool: { should: processedRules } }\n : processedRules,\n }\n : { [/^or$/i.test(rg.combinator) ? 'should' : 'must']: processedRules },\n };\n };\n\n const processedRuleGroup = processRuleGroup(query);\n return processedRuleGroup === false ? {} : processedRuleGroup;\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const expression: string = rg.rules\n .map(rule => {\n if (typeof rule === 'string') {\n return rule;\n }\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean)\n .join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '$not' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n DefaultCombinatorName,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupType,\n} from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): RQBJsonLogic => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n const jsonRuleGroup: RQBJsonLogic = { [rg.combinator]: processedRules } as {\n [k in DefaultCombinatorName]: [RQBJsonLogic, RQBJsonLogic, ...RQBJsonLogic[]];\n };\n\n return rg.not ? { '!': jsonRuleGroup } : jsonRuleGroup;\n };\n\n return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const rules: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean);\n\n const expression = rules.join('');\n\n const [notPrefix, notSuffix] = rg.not ? ['(!', ')'] : ['', ''];\n const [prefix, suffix] =\n rules.length > 1\n ? [`${notPrefix}(${rg.combinator === 'or' ? '|' : '&'}`, `)${notSuffix}`]\n : [notPrefix, notSuffix];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\nconst isBracketed = (str: string) => str.startsWith('{') && str.endsWith('}');\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string> = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const combinator = `\"$${lc(rg.combinator)}\"`;\n let hasChildRules = false;\n\n const expressions: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n // Don't wrap in curly braces if the result already is.\n return isBracketed(processedRuleGroup) ? processedRuleGroup : `{${processedRuleGroup}}`;\n }\n return '';\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : `${combinator}:[${expressions.join(',')}]`\n : fallbackExpression;\n };\n\n const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);\n return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;\n};\n","import type { NLTranslationKey, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { getNLTranslataion } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorNL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n translations,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const rg2 =\n isRuleGroupTypeIC(rg) && rg.rules.some(r => typeof r === 'string' && lc(r) === 'xor')\n ? convertFromIC(rg)\n : rg;\n\n const processedRules = rg2.rules.map(rule => {\n // Independent combinators\n if (typeof rule === 'string') {\n return `, ${translations[rule as NLTranslationKey] ?? rule} `;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n return processRuleGroup(\n rule,\n rg2.rules.length === 1 &&\n !(rg2.not || /^xor$/i.test(rg2.combinator ?? /* istanbul ignore next */ ''))\n );\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n });\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n const isXOR = lc(rg2.combinator ?? '') === 'xor';\n const combinator = isXOR ? rg2.combinator!.slice(1) : rg2.combinator;\n const mustWrap = rg2.not || !outermostOrLonelyInGroup || (isXOR && processedRules.length > 1);\n\n const [prefixTL, suffixTL] = (['groupPrefix', 'groupSuffix'] as const).map(key =>\n rg2.not\n ? isXOR\n ? getNLTranslataion(key, translations, ['not', 'xor'])\n : getNLTranslataion(key, translations, ['not'])\n : isXOR\n ? getNLTranslataion(key, translations, ['xor'])\n : getNLTranslataion(key, translations)\n );\n\n const prefix = mustWrap ? `${prefixTL} (`.trim() : '';\n const suffix = mustWrap ? `) ${suffixTL}`.trim() : '';\n\n return `${prefix}${processedRules\n .filter(Boolean)\n .join(\n isRuleGroupType(rg2)\n ? `, ${translations[combinator as NLTranslationKey] ?? combinator} `\n : ''\n )}${suffix}`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleType,\n} from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { isPojo } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n> = (ruleGroup, options) => {\n const {\n format,\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n const fieldParams: Map<string, Set<string>> = new Map();\n\n const getNextNamedParam = (field: string) => {\n if (!fieldParams.has(field)) {\n fieldParams.set(field, new Set());\n }\n const nextNamedParam = `${field}_${fieldParams.get(field)!.size + 1}`;\n fieldParams.get(field)!.add(nextNamedParam);\n return nextNamedParam;\n };\n\n const processRule = (rule: RuleType) => {\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const fieldData = getOption(fields, rule.field);\n\n const fieldParamNames = Object.fromEntries(\n ([...fieldParams.entries()] as [string, Set<string>][]).map(([f, s]) => [f, [...s]])\n );\n\n const processedRule = ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n getNextNamedParam,\n fieldParamNames,\n fieldData,\n },\n { processedParams: params }\n );\n\n if (!isPojo(processedRule)) {\n return '';\n }\n\n const { sql, params: customParams } = processedRule;\n\n if (typeof sql !== 'string' || !sql) {\n return '';\n }\n\n // istanbul ignore else\n if (format === 'parameterized' && Array.isArray(customParams)) {\n params.push(...customParams);\n } else if (format === 'parameterized_named' && isPojo(customParams)) {\n Object.assign(paramsNamed, customParams);\n // `getNextNamedParam` already adds new params to the list, but a custom\n // rule processor might not call it so we need to make sure we add\n // any new params here.\n for (const p of Object.keys(customParams)) fieldParams.get(rule.field)?.add(p);\n }\n\n return sql;\n };\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (typeof rule === 'string') {\n return rule;\n }\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule, rg.rules.length === 1);\n }\n return processRule(rule);\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n if (parameterized) {\n return { sql: processRuleGroup(ruleGroup, true), params };\n }\n return { sql: processRuleGroup(ruleGroup, true), params: paramsNamed };\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\n// TODO?: make this configurable\nexport const prismaFallback = {} as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n> = (ruleGroup, options) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? prismaFallback : undefined;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : prismaFallback;\n };\n\n const result = processRuleGroup(convertFromIC(ruleGroup), true);\n\n return ruleGroup.not ? { NOT: result } : result;\n};\n","import type { Op as _OpTypes, WhereOptions } from 'sequelize';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\ntype OpTypes = typeof _OpTypes;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined> = (\n ruleGroup,\n options\n) => {\n // istanbul ignore next\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n context = {},\n } = options;\n\n const { sequelizeOperators: Op } = context as {\n sequelizeOperators: OpTypes;\n };\n\n if (!Op) return;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): WhereOptions | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (expressions.length === 0) return;\n\n const result =\n expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [lc(combinator) === 'or' ? Op.or : Op.and]: expressions };\n\n return rg.not ? { [Op.not]: result } : result;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSQL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = rg.rules\n .map(rule => {\n // Independent combinators\n if (typeof rule === 'string') {\n return rule;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule, rg.rules.length === 1);\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { DefaultOperatorName, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';\ntype RangeRule = (\n | { gt: string | number }\n | { gte: string | number }\n | { lt: string | number }\n | { lte: string | number }\n) & { [k in RangeOperator]?: string | number };\ntype ElasticSearchRule =\n | { range: Record<string, RangeRule> }\n // oxlint-disable-next-line typescript/no-explicit-any\n | { term: Record<string, any> }\n | { exists: { field: string } }\n | { regexp: { [k: string]: { value: string } } };\ntype ElasticSearchQuery = {\n bool:\n | { filter: { script: { script: string } } }\n | { must: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[] }\n | {\n must_not:\n | ElasticSearchRule\n | ElasticSearchQuery\n | (ElasticSearchRule | ElasticSearchQuery)[];\n }\n | {\n should: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[];\n };\n};\n\nconst rangeOperatorMap = { '<': 'lt', '<=': 'lte', '>': 'gt', '>=': 'gte' } satisfies Record<\n '<' | '<=' | '>' | '>=',\n RangeOperator\n>;\n\nconst negateIfNotOp = (\n op: string,\n elasticSearchRule: ElasticSearchRule\n): ElasticSearchQuery | ElasticSearchRule =>\n op.startsWith('not') || op.startsWith('doesnot')\n ? { bool: { must_not: elasticSearchRule } }\n : elasticSearchRule;\n\nconst escapeSQ = (s: string) => s?.replace(/('|\\\\)/g, `\\\\$1`);\n\nconst textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>> = {\n beginswith: 'startsWith',\n doesnotbeginwith: 'startsWith',\n doesnotcontain: 'contains',\n doesnotendwith: 'endsWith',\n endswith: 'endsWith',\n};\nconst getTextScript = (f: string, o: Lowercase<DefaultOperatorName>, v: string) => {\n const script = `doc['${f}'].value.${textFunctionMap[o] ?? o}(doc['${v}'].value)`;\n return o.startsWith('d') ? `!${script}` : script;\n};\n\n// oxlint-disable-next-line typescript/no-explicit-any\nconst valueRenderer = (v: any, parseNumbers?: boolean) =>\n typeof v === 'boolean'\n ? v\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorElasticSearch: RuleProcessor = (\n rule,\n options = {}\n): ElasticSearchQuery | ElasticSearchRule | false => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const operatorLC = lc(operator) as Lowercase<DefaultOperatorName>;\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return false;\n\n if (valueSource === 'field') {\n // Bail out if not all values are strings\n if (toArray(value).some(v => typeof v !== 'string')) return false;\n\n const fieldForScript = escapeSQ(field);\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=': {\n const operatorForScript = operatorLC === '=' ? '==' : operatorLC;\n const valueForScript = escapeSQ(value);\n return valueForScript\n ? {\n bool: {\n filter: {\n script: {\n script: `doc['${fieldForScript}'].value ${operatorForScript} doc['${valueForScript}'].value`,\n },\n },\n },\n }\n : false;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({\n bool: {\n filter: { script: { script: `doc['${fieldForScript}'].value == doc['${v}'].value` } },\n },\n }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && valueAsArray[0] && valueAsArray[1]) {\n const script = `doc['${fieldForScript}'].value >= doc['${valueAsArray[0]}'].value && doc['${fieldForScript}'].value <= doc['${valueAsArray[1]}'].value`;\n return {\n bool: {\n filter: { script: { script: operatorLC === 'notbetween' ? `!(${script})` : script } },\n },\n };\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n case 'beginswith':\n case 'doesnotbeginwith':\n case 'endswith':\n case 'doesnotendwith': {\n const valueForScript = escapeSQ(value);\n if (!valueForScript) return false;\n const script = getTextScript(fieldForScript, operatorLC, valueForScript);\n return {\n bool: {\n filter: {\n script: {\n script,\n },\n },\n },\n };\n }\n }\n }\n\n switch (operatorLC) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n return {\n range: {\n [field]: {\n [rangeOperatorMap[operatorLC]]: valueRenderer(value, parseNumbers),\n } as RangeRule,\n },\n };\n\n case '=':\n return { term: { [field]: valueRenderer(value, parseNumbers) } };\n\n case '!=':\n return { bool: { must_not: { term: { [field]: valueRenderer(value, parseNumbers) } } } };\n\n case 'null':\n return { bool: { must_not: { exists: { field } } } };\n\n case 'notnull':\n return { exists: { field } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => valueRenderer(v, parseNumbers));\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({ term: { [field]: valueRenderer(v, parseNumbers) } }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n }\n return negateIfNotOp(operatorLC, { range: { [field]: { gte: first, lte: second } } });\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}.*` } } });\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `${value}.*` } } });\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}` } } });\n }\n return false;\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst quote = (v: any, escapeQuotes?: boolean) =>\n `\"${typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`)}\"`;\n\nconst negate = (clause: string, negate: boolean) => (negate ? `$not(${clause})` : clause);\n\nconst escapeStringRegex = (s: string) =>\n `${s}`.replaceAll(/[/$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`).replaceAll('-', String.raw`\\x2d`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJSONata: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n } = options;\n\n const valueIsField = valueSource === 'field';\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const qfn = (f: string) =>\n getQuotedFieldName(f, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = `$count(${qfn(field)})`;\n const filteredCount = `$count($filter(${qfn(field)}, function($v) {${defaultRuleGroupProcessorJSONata(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$v.${r.field}` : '$v' }),\n }),\n options as FormatQueryFinalOptions\n )}}))`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} = ${totalCount}`;\n\n case 'none':\n return `${filteredCount} = 0`;\n\n case 'some':\n return `${filteredCount} > 0`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return `${qfn(field)} ${operatorLC} ${\n valueIsField\n ? qfn(trimIfString(value))\n : useBareValue\n ? trimIfString(value)\n : quote(value, escapeQuotes)\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return negate(\n `$contains(${qfn(field)}, ${valueIsField ? qfn(trimIfString(value)) : quote(value, escapeQuotes)})`,\n shouldNegate(operatorLC)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, 0, $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /^${escapeStringRegex(value)}/)`,\n shouldNegate(operatorLC)\n );\n\n case 'endswith':\n case 'doesnotendwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, $length(${qfn(field)}) - $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /${escapeStringRegex(value)}$/)`,\n shouldNegate(operatorLC)\n );\n\n case 'null':\n return `${qfn(field)} = null`;\n\n case 'notnull':\n return `${qfn(field)} != null`;\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negate(\n `${qfn(field)} in [${valueAsArray\n .map(val =>\n valueIsField\n ? `${qfn(trimIfString(val))}`\n : shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : quote(val, escapeQuotes)\n )\n .join(', ')}]`,\n shouldNegate(operatorLC)\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n let secondValue = Number.isNaN(secondNum) ? (valueIsField ? `${second}` : second) : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n const renderAsNumbers =\n shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers);\n const getValueString = (raw: string, val: string | number) =>\n valueIsField ? qfn(raw) : renderAsNumbers ? val : quote(val, escapeQuotes);\n\n const expression = `${qfn(field)} >= ${getValueString(first, firstValue)} and ${qfn(field)} <= ${getValueString(second, secondValue)}`;\n\n return operatorLC === 'between' ? `(${expression})` : negate(expression, true);\n }\n }\n\n return '';\n};\n","import type {\n FormatQueryFinalOptions,\n JsonLogicVar,\n RQBJsonLogic,\n RuleProcessor,\n} from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst convertOperator = (op: '<' | '<=' | '=' | '!=' | '>' | '>=') =>\n op\n .replace(/^(=)$/, '$1=')\n .replace(/^notnull$/i, '!=')\n .replace(/^null$/i, '==') as '<' | '<=' | '==' | '!=' | '===' | '!==' | '>' | '>=';\n\nconst negateIfNotOp = (op: string, jsonRule: RQBJsonLogic) =>\n op.startsWith('not') || op.startsWith('doesnot') ? { '!': jsonRule } : jsonRule;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJsonLogic: RuleProcessor = (rule, options = {}): RQBJsonLogic => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const valueIsField = valueSource === 'field';\n const fieldObject: JsonLogicVar = { var: field };\n const fieldOrNumberRenderer = (v: string) =>\n valueIsField\n ? { var: `${v}` }\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return false;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n switch (mode) {\n case 'all':\n case 'none':\n case 'some':\n return {\n [mode]: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n } as RQBJsonLogic;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n const filteredCount = {\n reduce: [\n {\n filter: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n },\n { '+': [1, { var: 'accumulator' }] },\n 0,\n ],\n };\n\n if (threshold > 0 && threshold < 1) {\n const totalCount = {\n reduce: [{ var: field }, { '+': [1, { var: 'accumulator' }] }, 0],\n };\n return { [op]: [filteredCount, { '*': [totalCount, threshold] }] } as RQBJsonLogic;\n }\n return { [op]: [filteredCount, threshold] } as RQBJsonLogic;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return {\n [convertOperator(operatorLC)]: [fieldObject, fieldOrNumberRenderer(value)],\n } as RQBJsonLogic;\n\n case 'null':\n case 'notnull': {\n return {\n [`${operatorLC === 'notnull' ? '!' : '='}=`]: [fieldObject, null],\n } as RQBJsonLogic;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => fieldOrNumberRenderer(v));\n return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && 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: RQBJsonLogic = { '<=': [first, fieldObject, second] };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain': {\n const jsonRule: RQBJsonLogic = {\n in: [fieldOrNumberRenderer(value), fieldObject],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const jsonRule: RQBJsonLogic = {\n startsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const jsonRule: RQBJsonLogic = {\n endsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n }\n return false;\n};\n","import type { RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst negateIf = (clause: string, negate: boolean) => (negate ? `(!${clause})` : `${clause}`);\n\nconst ldapEscape = (s: unknown) =>\n `${trimIfString(s)}`.replaceAll(\n /[()&|=<>~*\\\\/]/g,\n (m: string) => `\\\\${m.codePointAt(0)!.toString(16)}`\n );\n\n/**\n * Default rule processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorLDAP: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { preserveValueOrder } = options;\n const operatorLC = lc(operator);\n\n // Bail out if...\n if (\n // This is a field comparison (which LDAP does not support), or\n valueSource === 'field' ||\n // `value` is null/undefined/empty and the operator is not unary, or\n (nullOrUndefinedOrEmpty(value) && operatorLC !== 'null' && operatorLC !== 'notnull') ||\n // a valid `match` property is found (match modes are not supported in this format)\n processMatchMode(rule)\n ) {\n return '';\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n return negateIf(`(${field}=${ldapEscape(value)})`, operatorLC === '!=');\n\n case '>':\n case '>=':\n return `(${field}>=${ldapEscape(value)})`;\n\n case '<':\n case '<=':\n return `(${field}<=${ldapEscape(value)})`;\n\n case 'contains':\n case 'doesnotcontain':\n return negateIf(`(${field}=*${ldapEscape(value)}*)`, operatorLC === 'doesnotcontain');\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIf(`(${field}=${ldapEscape(value)}*)`, operatorLC === 'doesnotbeginwith');\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIf(`(${field}=*${ldapEscape(value)})`, operatorLC === 'doesnotendwith');\n\n case 'null':\n case 'notnull':\n return negateIf(`(${field}=*)`, operatorLC === 'notnull');\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negateIf(\n `(|${valueAsArray.map(val => `(${field}=${ldapEscape(val)})`).join('')})`,\n operatorLC === 'notin'\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true)\n ? parseNumber(first, { parseNumbers: true })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, true)\n ? parseNumber(second, { parseNumbers: true })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return negateIf(\n `(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`,\n operatorLC === 'notbetween'\n );\n }\n }\n\n // istanbul ignore next\n return '';\n};\n","import type { FullField, ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\nconst escapeStringValueQuotes = (v: unknown, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : /* istanbul ignore next */ v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorNL: ValueProcessorByRule = (\n rule,\n // istanbul ignore next - defaultRuleProcessorNL always provides options\n opts = {}\n) => {\n const {\n escapeQuotes,\n fields,\n parseNumbers,\n quoteFieldNamesWith,\n quoteValuesWith,\n fieldIdentifierSeparator,\n translations,\n } = opts;\n const valueIsField = rule.valueSource === 'field';\n const operatorLowerCase = lc(rule.operator);\n const quoteChar = quoteValuesWith || /* istanbul ignore next */ \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) => `${quoteChar}${v}${quoteChar}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const t = translations ?? /* istanbul ignore next */ {};\n const orTL = t.or ?? 'or';\n const trueTL = t.true ?? 'true';\n const falseTL = t.false ?? 'false';\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n if (!valueIsField) {\n return defaultValueProcessorByRule(rule, opts);\n }\n\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true })\n .slice(0, 2)\n .map(v =>\n wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n );\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n return defaultValueProcessorByRule({ ...rule, value: valueAsArray }, opts);\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(rule.value);\n if (valueAsArray.length === 0) return '';\n const valStringArray = valueAsArray.map(v =>\n valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n );\n return `${valStringArray.slice(0, -1).join(', ')}${valStringArray.length > 2 ? ',' : ''} ${orTL} ${valStringArray.at(-1)}`;\n }\n }\n\n if (typeof rule.value === 'boolean') {\n return rule.value ? trueTL : falseTL;\n }\n\n return valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], rule.value)?.label ??\n rule.value\n )\n : shouldRenderAsNumber(rule.value, parseNumbers)\n ? `${trimIfString(rule.value)}`\n : `${wrapAndEscape(rule.value)}`;\n};\n","import type {\n DefaultOperatorName,\n ExportOperatorMap,\n FormatQueryFinalOptions,\n FullOption,\n RuleProcessor,\n} from '../../types';\nimport { lc } from '../misc';\nimport { getOption, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport { getQuotedFieldName, normalizeConstituentWordOrder, processMatchMode } from './utils';\n\n/**\n * Default operator map used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultExportOperatorMap: ExportOperatorMap = {\n '=': ['is', 'is the same as the value in'],\n '!=': ['is not', 'is not the same as the value in'],\n '<': ['is less than', 'is less than the value in'],\n '>': ['is greater than', 'is greater than the value in'],\n '<=': ['is less than or equal to', 'is less than or equal to the value in'],\n '>=': ['is greater than or equal to', 'is greater than or equal to the value in'],\n contains: ['contains', 'contains the value in'],\n beginswith: ['starts with', 'starts with the value in'],\n endswith: ['ends with', 'ends with the value in'],\n doesnotcontain: ['does not contain', 'does not contain the value in'],\n doesnotbeginwith: ['does not start with', 'does not start with the value in'],\n doesnotendwith: ['does not end with', 'does not end with the value in'],\n null: 'is null',\n notnull: 'is not null',\n in: ['is one of the values', 'is the same as a value in'],\n notin: ['is not one of the values', 'is not the same as any value in'],\n between: ['is between', 'is between the values in'],\n notbetween: ['is not between', 'is not between the values in'],\n};\n\n/* istanbul ignore next */\nconst defaultGetOperators = () => [];\n\n/**\n * Default operator processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorNL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, valueSource = 'value' } = rule;\n // istanbul ignore next\n const {\n getOperators = defaultGetOperators,\n operatorMap: operatorMapParam = defaultExportOperatorMap,\n } = opts;\n\n const mapOperatorMap = new Map<string, string | [string, string]>(\n Object.entries(defaultExportOperatorMap)\n );\n for (const [key, value] of Object.entries(operatorMapParam)) {\n mapOperatorMap.set(lc(key), value);\n }\n const operatorMap = Object.fromEntries(mapOperatorMap);\n\n const { value: operatorNL, label } = getOption(\n toFullOptionList(\n getOperators(field, {\n fieldData: opts.fieldData ?? {\n name: field,\n value: field,\n label: field,\n },\n }) ?? /* istanbul ignore next */ []\n ) as FullOption[],\n operator\n ) ?? {\n name: operator,\n value: operator,\n label: operator,\n };\n\n const operatorTL = operatorMap[operatorNL as DefaultOperatorName] ??\n operatorMap[lc(operatorNL) as Lowercase<DefaultOperatorName>] ?? [label, label];\n\n return typeof operatorTL === 'string' ? operatorTL : operatorTL[valueSource === 'field' ? 1 : 0];\n};\n\n/**\n * Default rule processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorNL: RuleProcessor = (rule, opts) => {\n const { field, operator } = rule;\n // istanbul ignore next\n const {\n fieldData,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorNL,\n valueProcessor = defaultValueProcessorNL,\n concatOperator = '||',\n wordOrder = 'SVO',\n } = opts ?? /* istanbul ignore next */ {};\n\n const processedField = getQuotedFieldName(fieldData?.label ?? field, {\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorNL(rule.value, {\n ...(opts as FormatQueryFinalOptions),\n fields: toFullOptionList(fieldData?.subproperties ?? []),\n });\n\n // (H)as (S)ub(P)roperties\n const hsp = (fieldData?.subproperties?.length ?? 0) > 0;\n\n switch (mode) {\n case 'all':\n return `(${hsp ? 'for ' : ''}every item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'none':\n return `(${hsp ? 'for ' : ''}no item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'some':\n return `(${hsp ? 'for ' : ''}at least one item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const mm = mode.replace('at', 'at ');\n if (threshold > 0 && threshold < 1) {\n return `(${hsp ? 'for ' : ''}${mm} ${threshold * 100}% of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n return `(${hsp ? 'for ' : ''}${mm} ${threshold} of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operatorLC = lc(operator);\n if (\n (operatorLC === 'in' ||\n operatorLC === 'notin' ||\n operatorLC === 'between' ||\n operatorLC === 'notbetween') &&\n !value\n ) {\n return '';\n }\n\n const processedOperator = operatorProcessor(rule, opts);\n\n const wordOrderMap = {\n S: processedField,\n V: processedOperator,\n O: value,\n };\n\n return normalizeConstituentWordOrder(wordOrder)\n .map(term => `${wordOrderMap[term]}`)\n .join(' ')\n .trim();\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { lc } from '../misc';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, mapSQLOperator, processMatchMode } from './utils';\n\n/**\n * Default operator processor used by {@link formatQuery} for \"sql\" and \"parameterized*\" formats.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorSQL: RuleProcessor = rule => lc(mapSQLOperator(rule.operator));\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSQL: RuleProcessor = (rule, opts = {}) => {\n const {\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n concatOperator = '||',\n } = opts;\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return '';\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const nestedArrayFilter = defaultRuleGroupProcessorSQL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) = array_length(${ruleField}, 1)`;\n\n case 'none':\n return `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'some':\n return `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operator = operatorProcessor(rule, opts);\n\n const operatorLowerCase = lc(operator);\n if (\n (operatorLowerCase === 'in' ||\n operatorLowerCase === 'not in' ||\n operatorLowerCase === 'between' ||\n operatorLowerCase === 'not between') &&\n !value\n ) {\n return '';\n }\n\n return `${ruleField} ${operator} ${value}`.trim();\n};\n","import type { FormatQueryFinalOptions, FullField, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultOperatorProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleProcessorParameterized: RuleProcessor = (rule, opts, meta) => {\n // TODO?: test for this so we don't have to ignore it\n // istanbul ignore next\n const {\n fieldData,\n format,\n getNextNamedParam,\n parseNumbers,\n paramPrefix,\n paramsKeepPrefix,\n numberedParams,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator,\n concatOperator,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n } = opts ?? {};\n\n const { processedParams = [] } = meta ?? {};\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n\n const finalize = (sql: string) =>\n parameterized ? { sql, params } : { sql, params: paramsNamed };\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return finalize('');\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const { sql: nestedSQL, params: nestedParams } = defaultRuleGroupProcessorParameterized(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n { ...(opts as FormatQueryFinalOptions), fields: [] as FullField[] }\n );\n // Ignore the \"parameterized_named\" case because PostgreSQL doesn't support named parameters\n // istanbul ignore else\n if (Array.isArray(nestedParams)) {\n params.push(...nestedParams);\n } else {\n Object.assign(paramsNamed, nestedParams);\n }\n\n switch (mode) {\n case 'all':\n return finalize(\n `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) = array_length(${ruleField}, 1)`\n );\n\n case 'none':\n return finalize(\n `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'some':\n return finalize(\n `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return finalize(\n `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`\n );\n }\n }\n }\n\n const value = valueProcessor(rule, {\n parseNumbers,\n quoteFieldNamesWith,\n concatOperator,\n fieldData,\n format,\n });\n\n const sqlOperator = operatorProcessor(rule, opts);\n const sqlOperatorLowerCase = lc(sqlOperator);\n const [qPre, qPost] = quoteFieldNamesWith;\n\n if (\n (sqlOperatorLowerCase === 'in' ||\n sqlOperatorLowerCase === 'not in' ||\n sqlOperatorLowerCase === 'between' ||\n sqlOperatorLowerCase === 'not between') &&\n !value\n ) {\n return finalize('');\n } else if (sqlOperatorLowerCase === 'is null' || sqlOperatorLowerCase === 'is not null') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator}`);\n } else if (rule.valueSource === 'field') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} ${value}`.trim());\n } else if (sqlOperatorLowerCase === 'in' || sqlOperatorLowerCase === 'not in') {\n const splitValue = toArray(rule.value);\n if (parameterized) {\n for (const v of splitValue) {\n params.push(shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v);\n }\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} (${splitValue\n .map((_v, i) =>\n numberedParams\n ? `${paramPrefix}${processedParams.length + 1 + splitValue.length - (splitValue.length - i)}`\n : '?'\n )\n .join(', ')})`\n );\n }\n const inParams: string[] = [];\n for (const v of splitValue) {\n const thisParamName = getNextNamedParam!(rule.field);\n inParams.push(`${paramPrefix}${thisParamName}`);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${thisParamName}`] = shouldRenderAsNumber(\n v,\n parseNumbers\n )\n ? parseNumber(v, { parseNumbers })\n : v;\n }\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} (${inParams.join(', ')})`);\n } else if (sqlOperatorLowerCase === 'between' || sqlOperatorLowerCase === 'not between') {\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true });\n const [first, second] = valueAsArray\n .slice(0, 2)\n .map(v => (shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v));\n if (parameterized) {\n params.push(first, second);\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n numberedParams ? `${paramPrefix}${processedParams.length + 1}` : '?'\n } and ${numberedParams ? `${paramPrefix}${processedParams.length + 2}` : '?'}`\n );\n }\n const firstParamName = getNextNamedParam!(rule.field);\n const secondParamName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${firstParamName}`] = first;\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${secondParamName}`] = second;\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${paramPrefix}${firstParamName} and ${paramPrefix}${secondParamName}`\n );\n }\n\n let paramValue = rule.value;\n if (typeof rule.value === 'string') {\n if (shouldRenderAsNumber(rule.value, parseNumbers)) {\n paramValue = parseNumber(rule.value, { parseNumbers });\n } else {\n // Note that we're using `value` here, which has been processed through\n // a `valueProcessor`, as opposed to `rule.value` which has not\n paramValue = /^'.*'$/g.test(value)\n ? value.replaceAll(/(^'|'$)/g, '')\n : /* istanbul ignore next */ value;\n }\n }\n\n let paramName = '';\n if (parameterized) {\n params.push(paramValue);\n } else {\n paramName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${paramName}`] = paramValue;\n }\n\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n parameterized\n ? numberedParams\n ? `${paramPrefix}${processedParams.length + 1}`\n : '?'\n : `${paramPrefix}${paramName}`\n }`.trim()\n );\n};\n","import type { ParseNumbersPropConfig, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, prismaOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers?: ParseNumbersPropConfig) =>\n shouldRenderAsNumber(value, !!parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: !!parseNumbers }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorPrisma: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder } = options;\n\n // Neither field-to-field comparisons nor match modes are supported in this format\n if (valueSource === 'field' || processMatchMode(rule)) return;\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '=':\n return { [field]: processNumber(value, value, parseNumbers) };\n\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const prismaOperator = prismaOperators[operatorLC];\n return {\n [field]: {\n [prismaOperator]: processNumber(value, value, parseNumbers),\n },\n };\n }\n\n case 'contains':\n return { [field]: { contains: value } };\n\n case 'beginswith':\n return { [field]: { startsWith: value } };\n\n case 'endswith':\n return { [field]: { endsWith: value } };\n\n case 'doesnotcontain':\n return { NOT: { [field]: { contains: value } } };\n\n case 'doesnotbeginwith':\n return { NOT: { [field]: { startsWith: value } } };\n\n case 'doesnotendwith':\n return { NOT: { [field]: { endsWith: value } } };\n\n case 'null':\n return { [field]: null };\n\n case 'notnull':\n return { [field]: { not: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [prismaOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorLC === 'between'\n ? { [field]: { gte: firstValue, lte: secondValue } }\n : { OR: [{ [field]: { lt: firstValue } }, { [field]: { gt: secondValue } }] };\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { Op as _OpTypes, col as _colType, fn as _fnType } from 'sequelize';\nimport type { RuleProcessor, Simplify } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype OpTypes = Simplify<typeof _OpTypes>;\ntype ColType = typeof _colType;\ntype FnType = typeof _fnType;\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSequelize: RuleProcessor = (\n rule,\n // istanbul ignore next\n { parseNumbers, preserveValueOrder, context = {} } = {}\n): Record<string, unknown> | undefined => {\n const {\n sequelizeOperators: Op,\n sequelizeCol: col,\n sequelizeFn: fn,\n } = context as {\n sequelizeOperators: OpTypes;\n sequelizeCol?: ColType;\n sequelizeFn?: FnType;\n };\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return;\n\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n\n const operatorLC = lc(operator);\n\n if (\n // Bail out if we don't have the Op symbols\n !Op ||\n // ...or valueSource is 'field' and we don't have the `col` function,\n (valueIsField &&\n (!col ||\n // ...or valueSource is 'field' and we don't have the `fn` function\n // and the operator is one of the \"doesNot*\" ones\n (!fn && ['doesnotcontain', 'doesnotbeginwith', 'doesnotendwith'].includes(operatorLC))))\n ) {\n return;\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const sequelizeOperator = {\n '=': Op.eq,\n '!=': Op.ne,\n '<': Op.lt,\n '<=': Op.lte,\n '>': Op.gt,\n '>=': Op.gte,\n }[operatorLC];\n return {\n [field]:\n valueIsField && operatorLC === '='\n ? { [Op.col]: value }\n : {\n [sequelizeOperator]: valueIsField\n ? col!(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? parseNumber(value, { parseNumbers: 'strict' })\n : value,\n },\n };\n }\n\n case 'contains':\n return { [field]: { [Op.substring]: valueIsField ? col!(value) : `${value}` } };\n\n case 'beginswith':\n return { [field]: { [Op.startsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'endswith':\n return { [field]: { [Op.endsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'doesnotcontain':\n return {\n [field]: {\n [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value), '%') : `%${value}%`,\n },\n };\n\n case 'doesnotbeginwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', col!(value), '%') : `${value}%` },\n };\n\n case 'doesnotendwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value)) : `%${value}` },\n };\n\n case 'null':\n return { [field]: { [Op.is]: null } };\n\n case 'notnull':\n return { [field]: { [Op.not]: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [operatorLC === 'in' ? Op.in : Op.notIn]: valueAsArray.map(val =>\n valueIsField\n ? col!(val)\n : shouldRenderAsNumber(val, parseNumbers)\n ? parseNumber(val, { parseNumbers: 'strict' })\n : val\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return;\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? first : firstNum;\n const secondValue = Number.isNaN(secondNum) ? second : secondNum;\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return {\n [field]: {\n [operatorLC === 'between' ? Op.between : Op.notBetween]: valueIsField\n ? valsOneAndTwoOnly.map(v => col!(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly,\n },\n };\n }\n }\n return;\n};\n","import { produce } from 'immer';\nimport { defaultPlaceholderFieldName, defaultPlaceholderOperatorName } from '../../defaults';\nimport type {\n ExportFormat,\n ExportObjectFormats,\n FormatQueryFinalOptions,\n FormatQueryOptions,\n FullField,\n FullOperator,\n FullOptionList,\n InputType,\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleProcessor,\n RuleType,\n RuleValidator,\n SetOptional,\n SQLPreset,\n ValidationMap,\n ValidationResult,\n ValueProcessorByRule,\n} from '../../types';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { lc } from '../misc';\nimport { toFlatOptionArray, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { defaultRuleGroupProcessorElasticSearch } from './defaultRuleGroupProcessorElasticSearch';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { defaultRuleGroupProcessorLDAP } from './defaultRuleGroupProcessorLDAP';\nimport { defaultRuleGroupProcessorMongoDB } from './defaultRuleGroupProcessorMongoDB';\nimport {\n defaultRuleGroupProcessorMongoDBQuery,\n mongoDbFallback,\n} from './defaultRuleGroupProcessorMongoDBQuery';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultRuleGroupProcessorPrisma, prismaFallback } from './defaultRuleGroupProcessorPrisma';\nimport { defaultRuleGroupProcessorSequelize } from './defaultRuleGroupProcessorSequelize';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\nimport { defaultRuleProcessorElasticSearch } from './defaultRuleProcessorElasticSearch';\nimport { defaultRuleProcessorJSONata } from './defaultRuleProcessorJSONata';\nimport { defaultRuleProcessorJsonLogic } from './defaultRuleProcessorJsonLogic';\nimport { defaultRuleProcessorLDAP } from './defaultRuleProcessorLDAP';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\nimport { defaultOperatorProcessorNL, defaultRuleProcessorNL } from './defaultRuleProcessorNL';\nimport { defaultRuleProcessorParameterized } from './defaultRuleProcessorParameterized';\nimport { defaultRuleProcessorPrisma } from './defaultRuleProcessorPrisma';\nimport { defaultRuleProcessorSequelize } from './defaultRuleProcessorSequelize';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultOperatorProcessorSQL, defaultRuleProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport {\n bigIntJsonStringifyReplacer,\n getQuoteFieldNamesWithArray,\n isValueProcessorLegacy,\n numerifyValues,\n} from './utils';\n\n/**\n * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.\n *\n * @group Export\n */\nexport const sqlDialectPresets: Record<SQLPreset, FormatQueryOptions> = {\n ansi: {}, // This should always be empty\n sqlite: {\n paramsKeepPrefix: true,\n },\n oracle: {},\n mssql: {\n concatOperator: '+',\n quoteFieldNamesWith: ['[', ']'],\n fieldIdentifierSeparator: '.',\n paramPrefix: '@',\n },\n mysql: {\n concatOperator: 'CONCAT',\n },\n postgresql: {\n quoteFieldNamesWith: '\"',\n numberedParams: true,\n paramPrefix: '$',\n },\n};\n\n/**\n * A collection of option presets for {@link formatQuery}.\n *\n * @group Export\n */\nexport const formatQueryOptionPresets: Record<string, FormatQueryOptions> = {\n ...sqlDialectPresets,\n};\n\nconst defaultRuleProcessors = {\n cel: defaultRuleProcessorCEL,\n drizzle: defaultRuleProcessorDrizzle,\n elasticsearch: defaultRuleProcessorElasticSearch,\n json_without_ids: defaultRuleProcessorSQL,\n json: defaultRuleProcessorSQL,\n jsonata: defaultRuleProcessorJSONata,\n jsonlogic: defaultRuleProcessorJsonLogic,\n ldap: defaultRuleProcessorLDAP,\n mongodb_query: defaultRuleProcessorMongoDBQuery,\n mongodb: defaultRuleProcessorMongoDB,\n natural_language: defaultRuleProcessorNL,\n parameterized_named: defaultRuleProcessorParameterized,\n parameterized: defaultRuleProcessorParameterized,\n prisma: defaultRuleProcessorPrisma,\n sequelize: defaultRuleProcessorSequelize,\n spel: defaultRuleProcessorSpEL,\n sql: defaultRuleProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\n/* istanbul ignore next */\nconst defaultOperatorProcessor: RuleProcessor = r => r.operator;\nconst defaultOperatorProcessors = {\n cel: defaultOperatorProcessor,\n drizzle: defaultOperatorProcessor,\n elasticsearch: defaultOperatorProcessor,\n json_without_ids: defaultOperatorProcessor,\n json: defaultOperatorProcessor,\n jsonata: defaultOperatorProcessor,\n jsonlogic: defaultOperatorProcessor,\n ldap: defaultOperatorProcessor,\n mongodb_query: defaultOperatorProcessor,\n mongodb: defaultOperatorProcessor,\n natural_language: defaultOperatorProcessorNL,\n parameterized_named: defaultOperatorProcessorSQL,\n parameterized: defaultOperatorProcessorSQL,\n prisma: defaultOperatorProcessor,\n sequelize: defaultOperatorProcessor,\n spel: defaultOperatorProcessor,\n sql: defaultOperatorProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\nconst defaultFallbackExpressions: Partial<Record<ExportFormat, string>> = {\n cel: '1 == 1',\n ldap: '',\n mongodb: '\"$and\":[{\"$expr\":true}]',\n natural_language: '1 is 1',\n spel: '1 == 1',\n sql: '(1 = 1)',\n};\n\ntype MostFormatQueryOptions = SetOptional<\n Required<FormatQueryOptions>,\n | 'context'\n | 'fallbackExpression'\n | 'operatorProcessor'\n | 'ruleGroupProcessor'\n | 'ruleProcessor'\n | 'validator'\n | 'valueProcessor'\n | 'placeholderValueName'\n | 'parseNumbers'\n>;\n\nconst defaultFormatQueryOptions = {\n format: 'json',\n fields: [] as FullOptionList<FullField>,\n quoteFieldNamesWith: ['', ''],\n fieldIdentifierSeparator: '',\n getOperators: () => [] as FullOptionList<FullOperator>,\n paramPrefix: ':',\n paramsKeepPrefix: false,\n numberedParams: false,\n preserveValueOrder: false,\n placeholderFieldName: defaultPlaceholderFieldName,\n placeholderOperatorName: defaultPlaceholderOperatorName,\n quoteValuesWith: \"'\",\n concatOperator: '||',\n preset: 'ansi',\n wordOrder: 'SVO',\n translations: {},\n operatorMap: {},\n} satisfies MostFormatQueryOptions;\n\nconst valueProcessorCanActAsRuleProcessor = new Set<ExportFormat>([\n 'cel',\n 'drizzle',\n 'elasticsearch',\n 'jsonata',\n 'jsonlogic',\n 'ldap',\n 'mongodb_query',\n 'mongodb',\n 'prisma',\n 'sequelize',\n 'spel',\n]);\n\nconst sqlFormats = new Set<ExportFormat>([\n 'sql',\n 'parameterized',\n 'parameterized_named',\n 'drizzle',\n 'prisma',\n 'sequelize',\n]);\n\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny): string;\n/**\n * Generates a result based on the provided rule group processor.\n *\n * @group Export\n */\nfunction formatQuery<TResult = unknown>(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { ruleGroupProcessor: RuleGroupProcessor<TResult> }\n): TResult;\n/**\n * Generates a {@link index!ParameterizedSQL ParameterizedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized' | (FormatQueryOptions & { format: 'parameterized' })\n): ParameterizedSQL;\n/**\n * Generates a {@link index!ParameterizedNamedSQL ParameterizedNamedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized_named' | (FormatQueryOptions & { format: 'parameterized_named' })\n): ParameterizedNamedSQL;\n/**\n * Generates a {@link index!RQBJsonLogic JsonLogic} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonlogic' | (FormatQueryOptions & { format: 'jsonlogic' })\n): RQBJsonLogic;\n/**\n * Generates an ElasticSearch query object from an RQB query object.\n *\n * NOTE: Support for the ElasticSearch format is experimental.\n * You may have better results exporting \"sql\" format then using\n * [ElasticSearch SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html).\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'elasticsearch' | (FormatQueryOptions & { format: 'elasticsearch' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb\" format, but returns a JSON object\n * instead of a string.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb_query' | (FormatQueryOptions & { format: 'mongodb_query' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a JSON.stringify'd MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb_query\" format, but returns a string\n * instead of a JSON object.\n *\n * @deprecated Use the \"mongodb_query\" format for greater flexibility.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb' | (FormatQueryOptions & { format: 'mongodb' })\n): string;\n/**\n * Generates a Prisma ORM query object from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'prisma' | (FormatQueryOptions & { format: 'prisma' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a Drizzle ORM query function from an RQB query object. The function can\n * be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'drizzle' | (FormatQueryOptions & { format: 'drizzle' })\n): ReturnType<typeof defaultRuleGroupProcessorDrizzle>;\n/**\n * Generates a Sequelize query object from an RQB query object. The object can\n * be assigned to the `where` property in the Sequelize query functions.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'sequelize' | (FormatQueryOptions & { format: 'sequelize' })\n): ReturnType<typeof defaultRuleGroupProcessorSequelize>;\n/**\n * Generates a JSONata query string from an RQB query object.\n *\n * NOTE: Either `parseNumbers: \"strict-limited\"` or `parseNumbers: true`\n * are recommended for this format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonata' | (FormatQueryOptions & { format: 'jsonata' })\n): string;\n/**\n * Generates an LDAP query string from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'ldap' | (FormatQueryOptions & { format: 'ldap' })\n): string;\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny, options: FormatQueryOptions): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: Exclude<ExportFormat, ExportObjectFormats>\n): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { format: Exclude<ExportFormat, ExportObjectFormats> }\n): string;\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n optionParam: FormatQueryOptions | ExportFormat = {}\n) {\n const options = typeof optionParam === 'string' ? { format: lc(optionParam) } : optionParam;\n\n const optObj: MostFormatQueryOptions = {\n ...defaultFormatQueryOptions,\n ...(!options.format || sqlFormats.has(options.format)\n ? (sqlDialectPresets[options.preset ?? 'ansi'] ?? null)\n : null),\n ...options,\n ...(!options.format &&\n (Object.keys(sqlDialectPresets).includes(options.preset ?? '') ? { format: 'sql' } : null)),\n };\n\n const format = lc(optObj.format);\n\n const {\n fallbackExpression: fallbackExpression_option,\n getOperators: getOperators_option,\n operatorProcessor: operatorProcessor_option,\n parseNumbers,\n quoteFieldNamesWith: quoteFieldNamesWith_option,\n ruleGroupProcessor: ruleGroupProcessor_option,\n ruleProcessor: ruleProcessor_option,\n validator,\n valueProcessor: valueProcessor_option,\n context,\n } = optObj;\n\n const getParseNumberBoolean = (inputType?: InputType | null): boolean | undefined => {\n const parseNumberMethod = getParseNumberMethod({ parseNumbers, inputType });\n return typeof parseNumberMethod === 'string'\n ? true\n : typeof parseNumbers === 'boolean'\n ? parseNumbers\n : undefined;\n };\n\n const operatorProcessor =\n typeof operatorProcessor_option === 'function'\n ? operatorProcessor_option\n : (defaultOperatorProcessors[format] ?? defaultOperatorProcessor);\n\n const valueProcessor: ValueProcessorByRule =\n typeof valueProcessor_option === 'function'\n ? isValueProcessorLegacy(valueProcessor_option)\n ? r => valueProcessor_option(r.field, r.operator, r.value, r.valueSource)\n : valueProcessor_option\n : format === 'natural_language'\n ? defaultValueProcessorNL\n : valueProcessorCanActAsRuleProcessor.has(format)\n ? (ruleProcessor_option ?? defaultRuleProcessors[format])\n : defaultValueProcessorByRule;\n\n const ruleProcessor =\n (typeof ruleProcessor_option === 'function' ? ruleProcessor_option : null) ??\n (valueProcessorCanActAsRuleProcessor.has(format) &&\n typeof ruleProcessor_option !== 'function' &&\n valueProcessor_option\n ? valueProcessor\n : null) ??\n defaultRuleProcessors[format] ??\n defaultRuleProcessorSQL;\n\n const quoteFieldNamesWith = getQuoteFieldNamesWithArray(quoteFieldNamesWith_option);\n const fields = toFullOptionList(optObj.fields) as FullOptionList<FullField>;\n const getOperators: FormatQueryOptions['getOperators'] = (f, m) =>\n toFullOptionList(getOperators_option(f, m) ?? /* istanbul ignore next */ []);\n\n const fallbackExpression =\n fallbackExpression_option ??\n defaultFallbackExpressions[format] ??\n defaultFallbackExpressions.sql!;\n\n // #region Validation\n let validationMap: ValidationMap = {};\n\n // istanbul ignore else\n if (typeof validator === 'function') {\n const validationResult = validator(ruleGroup);\n if (typeof validationResult === 'boolean') {\n // istanbul ignore else\n if (!validationResult) {\n return format === 'parameterized'\n ? { sql: fallbackExpression, params: [] }\n : format === 'parameterized_named'\n ? { sql: fallbackExpression, params: {} }\n : format === 'mongodb'\n ? `{${fallbackExpression}}`\n : format === 'mongodb_query'\n ? mongoDbFallback\n : format === 'prisma'\n ? prismaFallback\n : format === 'jsonlogic'\n ? false\n : format === 'elasticsearch'\n ? {}\n : format === 'drizzle' || format === 'sequelize'\n ? undefined\n : fallbackExpression;\n }\n } else {\n validationMap = validationResult;\n }\n }\n\n const validatorMap: Record<string, RuleValidator> = {};\n const uniqueFields = toFlatOptionArray(fields) satisfies FullField[];\n for (const f of uniqueFields) {\n // istanbul ignore else\n if (typeof f.validator === 'function') {\n validatorMap[f.value ?? /* istanbul ignore next */ f.name] = f.validator;\n }\n }\n\n const validateRule = (rule: RuleType) => {\n let validationResult: boolean | ValidationResult | undefined;\n let fieldValidator: RuleValidator | undefined;\n if (rule.id) {\n validationResult = validationMap[rule.id];\n }\n if (uniqueFields.length > 0) {\n const fieldArr = uniqueFields.filter(f => f.name === rule.field);\n if (fieldArr.length > 0) {\n const field = fieldArr[0];\n // istanbul ignore else\n if (typeof field.validator === 'function') {\n fieldValidator = field.validator;\n }\n }\n }\n return [validationResult, fieldValidator] as const;\n };\n // #endregion\n\n const finalOptions: FormatQueryFinalOptions = {\n ...optObj,\n fallbackExpression,\n fields,\n format,\n getOperators,\n getParseNumberBoolean,\n quoteFieldNamesWith,\n operatorProcessor,\n ruleProcessor,\n valueProcessor,\n validateRule,\n validationMap,\n context,\n };\n\n if (typeof ruleGroupProcessor_option === 'function') {\n return ruleGroupProcessor_option(ruleGroup, finalOptions);\n }\n\n switch (format) {\n case 'json':\n case 'json_without_ids': {\n const rg = parseNumbers\n ? produce(ruleGroup, g => numerifyValues(g, finalOptions))\n : ruleGroup;\n if (format === 'json_without_ids') {\n return JSON.stringify(rg, (key, value) =>\n // Remove `id` and `path` keys; leave everything else unchanged.\n key === 'id' || key === 'path' ? undefined : bigIntJsonStringifyReplacer(key, value)\n );\n }\n return JSON.stringify(rg, bigIntJsonStringifyReplacer, 2);\n }\n\n case 'sql':\n return defaultRuleGroupProcessorSQL(ruleGroup, finalOptions);\n\n case 'parameterized':\n case 'parameterized_named':\n return defaultRuleGroupProcessorParameterized(ruleGroup, finalOptions);\n\n case 'mongodb':\n return defaultRuleGroupProcessorMongoDB(ruleGroup, finalOptions);\n\n case 'mongodb_query':\n return defaultRuleGroupProcessorMongoDBQuery(ruleGroup, finalOptions);\n\n case 'cel':\n return defaultRuleGroupProcessorCEL(ruleGroup, finalOptions);\n\n case 'spel':\n return defaultRuleGroupProcessorSpEL(ruleGroup, finalOptions);\n\n case 'jsonata':\n return defaultRuleGroupProcessorJSONata(ruleGroup, finalOptions);\n\n case 'jsonlogic':\n return defaultRuleGroupProcessorJsonLogic(ruleGroup, finalOptions);\n\n case 'elasticsearch':\n return defaultRuleGroupProcessorElasticSearch(ruleGroup, finalOptions);\n\n case 'natural_language':\n return defaultRuleGroupProcessorNL(ruleGroup, finalOptions);\n\n case 'ldap':\n return defaultRuleGroupProcessorLDAP(ruleGroup, finalOptions);\n\n case 'prisma':\n return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);\n\n case 'drizzle':\n return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);\n\n case 'sequelize':\n return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);\n\n default:\n return '';\n }\n}\n\nexport { formatQuery };\n","/**\n * Converts a given query object into one of the supported {@link index!ExportFormat ExportFormat} formats.\n *\n * @module formatQuery\n */\n\nimport type { RuleProcessor, ValueProcessorByRule, ValueProcessorLegacy } from '../../types';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\n\nconst generateValueProcessor =\n (vpbr: ValueProcessorByRule): ValueProcessorLegacy =>\n (field, operator, value, valueSource) =>\n vpbr({ field, operator, value, valueSource }, { parseNumbers: false });\n// TODO: Deprecate defaultValueProcessor.\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultValueProcessorByRule\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultMongoDBValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultRuleProcessorMongoDB\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultCELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorCEL);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultSpELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorSpEL);\n\nexport * from './defaultRuleGroupProcessorCEL';\nexport * from './defaultRuleGroupProcessorDrizzle';\nexport * from './defaultRuleGroupProcessorElasticSearch';\nexport * from './defaultRuleGroupProcessorJSONata';\nexport * from './defaultRuleGroupProcessorJsonLogic';\nexport * from './defaultRuleGroupProcessorLDAP';\nexport * from './defaultRuleGroupProcessorMongoDB';\nexport * from './defaultRuleGroupProcessorMongoDBQuery';\nexport * from './defaultRuleGroupProcessorNL';\nexport * from './defaultRuleGroupProcessorParameterized';\nexport * from './defaultRuleGroupProcessorPrisma';\nexport * from './defaultRuleGroupProcessorSequelize';\nexport * from './defaultRuleGroupProcessorSpEL';\nexport * from './defaultRuleGroupProcessorSQL';\nexport * from './defaultRuleProcessorDrizzle';\nexport * from './defaultRuleProcessorElasticSearch';\nexport * from './defaultRuleProcessorJSONata';\nexport * from './defaultRuleProcessorJsonLogic';\nexport * from './defaultRuleProcessorLDAP';\nexport * from './defaultRuleProcessorMongoDBQuery';\nexport * from './defaultRuleProcessorNL';\nexport * from './defaultRuleProcessorParameterized';\nexport * from './defaultRuleProcessorPrisma';\nexport * from './defaultRuleProcessorSequelize';\nexport * from './defaultRuleProcessorSQL';\nexport * from './defaultValueProcessorNL';\nexport * from './formatQuery';\nexport * from './utils';\nexport {\n defaultRuleProcessorCEL,\n defaultRuleProcessorMongoDB,\n defaultRuleProcessorSpEL,\n defaultValueProcessorByRule,\n};\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorCELByRule: RuleProcessor = defaultRuleProcessorCEL;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultValueProcessorMongoDBByRule: RuleProcessor = defaultRuleProcessorMongoDB;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorSpELByRule: RuleProcessor = defaultRuleProcessorSpEL;\n","import type { Path, RuleGroupTypeAny, RuleType } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Return type for {@link findPath}.\n */\nexport type FindPathReturnType = RuleGroupTypeAny | RuleType | null;\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * at the given path within a query.\n */\nexport const findPath = (path: Path, query: RuleGroupTypeAny): FindPathReturnType => {\n let target: FindPathReturnType = query;\n let level = 0;\n while (level < path.length && target && isRuleGroup(target)) {\n const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n target = typeof t === 'string' ? null : t;\n level++;\n }\n\n return level < path.length ? null : target;\n};\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const findID = (id: string, query: RuleGroupTypeAny): FindPathReturnType => {\n if (query.id === id) {\n return query;\n }\n\n for (const rule of query.rules) {\n if (typeof rule === 'string') continue;\n if (rule.id === id) {\n return rule;\n } else if (isRuleGroup(rule)) {\n const subRule = findID(id, rule);\n if (subRule) {\n return subRule;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Returns the {@link Path} of the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const getPathOfID = (id: string, query: RuleGroupTypeAny): Path | null => {\n if (query.id === id) return [];\n\n const idx = query.rules.findIndex(r => !(typeof r === 'string') && r.id === id);\n\n if (idx >= 0) {\n return [idx];\n }\n\n for (const [i, r] of Object.entries(query.rules)) {\n if (isRuleGroup(r)) {\n const subPath = getPathOfID(id, r);\n if (Array.isArray(subPath)) {\n return [Number.parseInt(i), ...subPath];\n }\n }\n }\n\n return null;\n};\n\n/**\n * Truncates the last element of an array and returns the result as a new array.\n */\nexport const getParentPath = (path: Path): Path => path.slice(0, -1);\n\n/**\n * Determines if two paths (each `Path`) are equivalent.\n */\nexport const pathsAreEqual = (path1: Path, path2: Path): boolean =>\n path1.length === path2.length && path1.every((val, idx) => val === path2[idx]);\n\n/**\n * Determines if the first path is an ancestor of the second path. The first path must\n * be shorter and exactly match the second path up through the length of the first path.\n */\nexport const isAncestor = (maybeAncestor: Path, path: Path): boolean =>\n maybeAncestor.length < path.length &&\n new RegExp(`^${maybeAncestor.join('-')}`).test(path.join('-'));\n\n/**\n * Finds the deepest/longest path that two paths have in common.\n */\nexport const getCommonAncestorPath = (path1: Path, path2: Path): Path => {\n const commonAncestorPath: Path = [];\n const parentPath1 = getParentPath(path1);\n const parentPath2 = getParentPath(path2);\n let i = 0;\n\n while (i < parentPath1.length && i < parentPath2.length && parentPath1[i] === parentPath2[i]) {\n commonAncestorPath.push(parentPath2[i]);\n i++;\n }\n\n return commonAncestorPath;\n};\n\n/**\n * Determines if the rule or group at the specified path is either disabled itself\n * or disabled by an ancestor group.\n */\nexport const pathIsDisabled = (path: Path, query: RuleGroupTypeAny): boolean => {\n let disabled = !!query.disabled;\n let target: RuleType | RuleGroupTypeAny = query;\n let level = 0;\n while (level < path.length && !disabled && isRuleGroup(target)) {\n const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n if (isPojo(t) && (isRuleGroup(t) || ('field' in t && !!t.field))) {\n disabled = !!t.disabled;\n target = t;\n }\n level++;\n }\n return disabled;\n};\n","import type { AccessibleDescriptionGenerator as ADG } from '../types';\nimport { pathsAreEqual } from './pathUtils';\n\nexport const generateAccessibleDescription: ADG = params =>\n pathsAreEqual([], params.path) ? `Query builder` : `Rule group at path ${params.path.join('-')}`;\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import { defaultMatchModes } from '../defaults';\nimport type {\n FlexibleOption,\n FullField,\n GetOptionIdentifierType,\n MatchMode,\n MatchModeOptions,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n matchModes: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the match modes array for the given\n * field. If the field definition does not define a `matchModes`\n * property, the `getMatchModes` prop is used. Returns\n * `FullOption<MatchMode>[]` of all match modes by default.\n */\nexport const getMatchModesUtil = <F extends FullField>(\n fieldData: F,\n getMatchModes?: (\n field: GetOptionIdentifierType<F>,\n misc: { fieldData: F }\n ) => boolean | MatchMode[] | FlexibleOption<MatchMode>[]\n): MatchModeOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : /* istanbul ignore next */ dummyFD;\n\n let matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[] = fd.matchModes ?? false;\n\n if (!matchModes && getMatchModes) {\n matchModes = getMatchModes(fd.value as GetOptionIdentifierType<F>, {\n fieldData: fd as F,\n });\n }\n\n if (matchModes === true) {\n return defaultMatchModes;\n } else if (matchModes === false) {\n return [];\n }\n\n if (isFlexibleOptionArray(matchModes)) {\n return toFullOptionList(matchModes) as MatchModeOptions;\n }\n\n return (matchModes?.map(\n mm =>\n defaultMatchModes.find(dmm => dmm.value === lc(mm)) ?? {\n name: mm,\n value: mm,\n label: mm,\n }\n ) ?? []) as MatchModeOptions;\n};\n","import { standardClassnames } from '../defaults';\nimport type { ValidationResult } from '../types';\n\n/**\n * Gets the standard classname for valid or invalid components\n * based on the given validation result.\n */\nexport const getValidationClassNames = (\n validationResult: boolean | ValidationResult\n): '' | (typeof standardClassnames)['valid'] | (typeof standardClassnames)['invalid'] => {\n const valid =\n typeof validationResult === 'boolean'\n ? validationResult\n : typeof validationResult === 'object' && validationResult !== null\n ? validationResult.valid\n : null;\n return typeof valid === 'boolean'\n ? valid\n ? standardClassnames.valid\n : standardClassnames.invalid\n : '';\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import type { Classnames } from '../types';\nimport { clsx } from './clsx';\n\ntype MergeClassnamesParams = (Partial<Classnames> | undefined)[];\n\nconst joinClassnamesByName = (name: keyof Classnames, args: MergeClassnamesParams) =>\n clsx(args.map(c => clsx(c?.[name])));\n\n/**\n * Merges a list of partial {@link Classnames} definitions into a single definition.\n */\nexport const mergeClassnames = (...args: MergeClassnamesParams): Classnames => ({\n queryBuilder: joinClassnamesByName('queryBuilder', args),\n ruleGroup: joinClassnamesByName('ruleGroup', args),\n header: joinClassnamesByName('header', args),\n body: joinClassnamesByName('body', args),\n combinators: joinClassnamesByName('combinators', args),\n addRule: joinClassnamesByName('addRule', args),\n addGroup: joinClassnamesByName('addGroup', args),\n cloneRule: joinClassnamesByName('cloneRule', args),\n cloneGroup: joinClassnamesByName('cloneGroup', args),\n removeGroup: joinClassnamesByName('removeGroup', args),\n rule: joinClassnamesByName('rule', args),\n fields: joinClassnamesByName('fields', args),\n operators: joinClassnamesByName('operators', args),\n value: joinClassnamesByName('value', args),\n removeRule: joinClassnamesByName('removeRule', args),\n notToggle: joinClassnamesByName('notToggle', args),\n shiftActions: joinClassnamesByName('shiftActions', args),\n dragHandle: joinClassnamesByName('dragHandle', args),\n lockRule: joinClassnamesByName('lockRule', args),\n lockGroup: joinClassnamesByName('lockGroup', args),\n valueSource: joinClassnamesByName('valueSource', args),\n actionElement: joinClassnamesByName('actionElement', args),\n valueSelector: joinClassnamesByName('valueSelector', args),\n betweenRules: joinClassnamesByName('betweenRules', args),\n valid: joinClassnamesByName('valid', args),\n invalid: joinClassnamesByName('invalid', args),\n dndDragging: joinClassnamesByName('dndDragging', args),\n dndOver: joinClassnamesByName('dndOver', args),\n dndCopy: joinClassnamesByName('dndCopy', args),\n dndGroup: joinClassnamesByName('dndGroup', args),\n dndDropNotAllowed: joinClassnamesByName('dndDropNotAllowed', args),\n disabled: joinClassnamesByName('disabled', args),\n valueListItem: joinClassnamesByName('valueListItem', args),\n matchMode: joinClassnamesByName('matchMode', args),\n matchThreshold: joinClassnamesByName('matchThreshold', args),\n branches: joinClassnamesByName('branches', args),\n hasSubQuery: joinClassnamesByName('hasSubQuery', args),\n});\n","// All code in this file is adapted from:\n// npm: https://www.npmjs.com/package/ts-extras\n// src: https://github.com/sindresorhus/ts-extras\n\n/**\n * Original looked like this (not sure why template string is used):\n * ```\n * type ObjectKeys<T extends object> = `${Exclude<keyof T, symbol>}`;\n * ```\n */\ntype ObjectKeys<T extends object> = Exclude<keyof T, symbol>;\n\n/**\n * A strongly-typed version of `Object.keys()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-keys.ts)\n */\nexport const objectKeys = Object.keys as <Type extends object>(\n value: Type\n) => Array<ObjectKeys<Type>>;\n\n/**\n * A strongly-typed version of `Object.entries()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-entries.ts)\n */\nexport const objectEntries = Object.entries as <Type extends Record<PropertyKey, unknown>>(\n value: Type\n) => Array<[ObjectKeys<Type>, Type[ObjectKeys<Type>]]>;\n","import { produce } from 'immer';\nimport type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType =>\n produce(rule, draft => {\n if (!draft.id) {\n draft.id = idGenerator();\n }\n });\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG =>\n produce(queryObject, draft => {\n if (!draft.id) {\n draft.id = idGenerator();\n }\n draft.rules = draft.rules.map(r =>\n typeof r === 'string'\n ? r\n : isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator })\n ) as RuleGroupArray | RuleGroupICArray;\n });\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n","import type { RuleGroupTypeAny, RuleType, SetRequired } from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Options object for {@link regenerateID}/{@link regenerateIDs}.\n */\nexport interface RegenerateIdOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Generates a new `id` property for a rule.\n */\nexport const regenerateID = <R extends RuleType>(\n rule: R,\n { idGenerator = generateID }: RegenerateIdOptions = {}\n): SetRequired<R, 'id'> => structuredClone({ ...rule, id: idGenerator() } as SetRequired<R, 'id'>);\n\n/**\n * Recursively generates new `id` properties for a rule group and all its rules and subgroups.\n */\nexport const regenerateIDs = <RG>(\n subject: RG,\n { idGenerator = generateID }: RegenerateIdOptions = {}\n): RG & { id: string } => {\n if (!isPojo(subject)) return subject as RG & { id: string };\n\n if (!isRuleGroup(subject)) {\n return structuredClone({\n ...subject,\n id: idGenerator(),\n }) as RG & { id: string };\n }\n\n const newGroup = { ...subject, id: idGenerator() } as RuleGroupTypeAny;\n\n // istanbul ignore else\n if (Array.isArray(newGroup.rules)) {\n // oxlint-disable-next-line no-explicit-any\n (newGroup.rules as any) = subject.rules.map((r: unknown) =>\n typeof r === 'string'\n ? r\n : isRuleGroup(r)\n ? regenerateIDs(r, { idGenerator })\n : regenerateID(r as RuleType, { idGenerator })\n );\n }\n\n return newGroup as unknown as RG & { id: string };\n};\n","import { produce } from 'immer';\nimport { defaultCombinators } from '../defaults';\nimport type {\n MatchModeOptions,\n OptionList,\n Path,\n RuleGroupTypeAny,\n RuleType,\n UpdateableProperties,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { generateID } from './generateID';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { getFirstOption, getOption } from './optGroupUtils';\nimport {\n findID,\n findPath,\n getCommonAncestorPath,\n getParentPath,\n getPathOfID,\n pathsAreEqual,\n} from './pathUtils';\nimport { prepareRuleOrGroup } from './prepareQueryObjects';\nimport { regenerateIDs } from './regenerateIDs';\n\n/**\n * Options for {@link add}.\n *\n * @group Query Tools\n */\nexport interface AddOptions {\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then the first combinator in this list will be inserted\n * before the new rule/group if the parent group is not empty. This option\n * is overridden by `combinatorPreceding`.\n */\n combinators?: OptionList;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted before the new rule/group\n * if the parent group is not empty. This option will supersede `combinators`.\n */\n combinatorPreceding?: string;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Adds a rule or group to a query.\n * @returns The new query with the rule or group added.\n *\n * @group Query Tools\n */\nexport const add = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The rule or group to add. */\n ruleOrGroup: RG | RuleType,\n /** Path or ID of the group to add to. */\n parentPathOrID: Path | string,\n /** Options. */\n {\n combinators = defaultCombinators,\n combinatorPreceding,\n idGenerator = generateID,\n }: AddOptions = {}\n): RG =>\n produce(query, draft => {\n const parent = Array.isArray(parentPathOrID)\n ? findPath(parentPathOrID, draft)\n : findID(parentPathOrID, draft);\n\n if (!parent || !isRuleGroup(parent)) return;\n\n if (isRuleGroupTypeIC(parent) && parent.rules.length > 0) {\n const prevCombinator = parent.rules.at(-2);\n parent.rules.push(\n // @ts-expect-error This is technically a type violation until the next push\n // to the rules array, but that happens immediately and unconditionally so\n // there's no significant risk.\n combinatorPreceding ??\n (typeof prevCombinator === 'string' ? prevCombinator : getFirstOption(combinators))\n );\n }\n // `as RuleType` is only here to avoid the ambiguity with `RuleGroupTypeAny`\n parent.rules.push(prepareRuleOrGroup(ruleOrGroup, { idGenerator }) as RuleType);\n });\n\n/**\n * Options for {@link update}.\n *\n * @group Query Tools\n */\nexport interface UpdateOptions {\n /**\n * When updating the `field` of a rule, the rule's `operator`, `value`, and `valueSource`\n * will be reset to their respective defaults. Defaults to `true`.\n */\n resetOnFieldChange?: boolean;\n /**\n * When updating the `operator` of a rule, the rule's `value` and `valueSource`\n * will be reset to their respective defaults. Defaults to `false`.\n */\n resetOnOperatorChange?: boolean;\n /**\n * Determines the default operator name for a given field.\n */\n getRuleDefaultOperator?: (field: string) => string;\n /**\n * Determines the valid value sources for a given field and operator.\n */\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n /**\n * Gets the default value for a given rule, in case the value needs to be reset.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n getRuleDefaultValue?: (rule: RuleType) => any;\n /**\n * Determines the valid match modes for a given field.\n */\n getMatchModes?: (field: string) => MatchModeOptions;\n}\n/**\n * Updates a property of a rule or group within a query.\n * @returns The new query with the rule or group property updated.\n *\n * @group Query Tools\n */\nexport const update = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The name of the property to update. */\n prop: UpdateableProperties,\n /** The new value of the property. */\n // oxlint-disable-next-line typescript/no-explicit-any\n value: any,\n /** The path or ID of the rule or group to update. */\n pathOrID: Path | string,\n /** Options. */\n {\n resetOnFieldChange = true,\n resetOnOperatorChange = false,\n getRuleDefaultOperator = () => '=',\n getValueSources = () => ['value'],\n getRuleDefaultValue = () => '',\n getMatchModes = () => [],\n }: UpdateOptions = {}\n): RG =>\n produce(query, draft => {\n const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, draft);\n\n // Ignore invalid paths/ids\n if (!path) return;\n\n // Independent combinators\n if (prop === 'combinator' && !isRuleGroupType(draft)) {\n const parentRules = (findPath(getParentPath(path), draft) as RG).rules;\n // Only update an independent combinator if it occupies an odd index\n if (path.at(-1)! % 2 === 1) {\n parentRules[path.at(-1)!] = value;\n }\n return;\n }\n\n const ruleOrGroup = findPath(path, draft);\n\n // Ignore invalid paths\n if (!ruleOrGroup) return;\n\n const isGroup = isRuleGroup(ruleOrGroup);\n\n // Only update if there is actually a change\n // @ts-expect-error prop can refer to rule or group properties\n if (ruleOrGroup[prop] === value) return;\n\n // Handle valueSource updates later\n if (prop !== 'valueSource') {\n // @ts-expect-error prop can refer to rule or group properties\n ruleOrGroup[prop] = value;\n }\n\n // If this is a group, there's no more to do\n if (isGroup) return;\n\n let resetValueSource = false;\n let resetValue = false;\n\n if (prop === 'field') {\n const fromFieldMatchModes = getMatchModes(ruleOrGroup.field);\n const toFieldMatchModes = getMatchModes(value);\n\n if (toFieldMatchModes.length === 0) {\n delete ruleOrGroup.match;\n } else {\n const nextMatchMode =\n ruleOrGroup.match?.mode && getOption(toFieldMatchModes, ruleOrGroup.match.mode)\n ? null\n : getFirstOption(toFieldMatchModes);\n if (nextMatchMode) {\n ruleOrGroup.match = { mode: nextMatchMode, threshold: 1 };\n }\n }\n\n if (fromFieldMatchModes.length > 0 || toFieldMatchModes.length > 0) {\n // Force `resetOnFieldChange` when field is updated FROM or TO one that has match modes\n resetOnFieldChange = true;\n }\n }\n\n // Set default operator, valueSource, and value for field change\n if (resetOnFieldChange && prop === 'field') {\n ruleOrGroup.operator = getRuleDefaultOperator(value);\n resetValueSource = true;\n resetValue = true;\n }\n\n // Set default valueSource and value for operator change\n if (resetOnOperatorChange && prop === 'operator') {\n resetValueSource = true;\n resetValue = true;\n }\n\n const valueSources = getValueSourcesUtil(\n { name: ruleOrGroup.field, value: ruleOrGroup.field, label: '' },\n ruleOrGroup.operator,\n getValueSources\n );\n const defaultValueSource = getFirstOption(valueSources);\n if (\n (resetValueSource &&\n ruleOrGroup.valueSource &&\n defaultValueSource !== ruleOrGroup.valueSource) ||\n (prop === 'valueSource' && value !== ruleOrGroup.valueSource)\n ) {\n // Only reset the value if we're changing the valueSource either\n // 1) from `undefined` to something that is _not_ the default, or\n // 2) from the current (defined) value to something else\n resetValue =\n !!ruleOrGroup.valueSource || (!ruleOrGroup.valueSource && value !== defaultValueSource);\n ruleOrGroup.valueSource = resetValueSource ? defaultValueSource : value;\n }\n\n if (resetValue) {\n // The default value should be a valid field name if defaultValueSource is 'field'\n ruleOrGroup.value = getRuleDefaultValue(ruleOrGroup);\n }\n });\n\n/**\n * Removes a rule or group from a query.\n * @returns The new query with the rule or group removed.\n *\n * @group Query Tools\n */\nexport const remove = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The path or ID of the rule or group to remove. */\n pathOrID: Path | string\n): RG => {\n const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, query);\n\n // Ignore invalid paths/ids\n if (!path) return query;\n\n if (\n // Can't remove the root group\n path.length === 0 ||\n // Can't independently remove independent combinators\n (!isRuleGroupType(query) && !findPath(path, query))\n ) {\n return query;\n }\n\n return produce(query, draft => {\n const index = path.at(-1)!;\n const parent = findPath(getParentPath(path), draft);\n if (parent && isRuleGroup(parent)) {\n if (!isRuleGroupType(parent) && parent.rules.length > 1) {\n const idxStartDelete = index === 0 ? 0 : index - 1;\n parent.rules.splice(idxStartDelete, 2);\n } else {\n parent.rules.splice(index, 1);\n }\n }\n });\n};\n\nconst getNextPath = (\n query: RuleGroupTypeAny,\n currentPath: Path,\n newPathOrShiftDirection: Path | 'up' | 'down'\n): Path => {\n if (Array.isArray(newPathOrShiftDirection)) {\n return newPathOrShiftDirection;\n }\n\n const ic = isRuleGroupTypeIC(query);\n\n if (newPathOrShiftDirection === 'up') {\n if (pathsAreEqual(currentPath, [0])) {\n return currentPath;\n } else if (currentPath.at(-1) === 0) {\n const parentPath = getParentPath(currentPath);\n return [...getParentPath(parentPath), Math.max(0, parentPath.at(-1)! - (ic ? 1 : 0))];\n } else {\n const evaluationPath = [\n ...getParentPath(currentPath),\n Math.max(0, currentPath.at(-1)! - (ic ? 2 : 1)),\n ];\n const entityAtTarget = findPath(evaluationPath, query);\n if (isRuleGroup(entityAtTarget)) {\n return [...evaluationPath, entityAtTarget.rules.length];\n } else {\n const targetPath = [\n ...getParentPath(currentPath),\n Math.max(0, currentPath.at(-1)! - (ic ? 3 : 1)),\n ];\n return targetPath;\n }\n }\n } else if (newPathOrShiftDirection === 'down') {\n if (pathsAreEqual([query.rules.length - 1], currentPath)) {\n return currentPath;\n } else if (\n currentPath.at(-1) ===\n (findPath(getParentPath(currentPath), query) as RuleGroupTypeAny).rules.length - 1\n ) {\n const parentPath = getParentPath(currentPath);\n return [...getParentPath(parentPath), parentPath.at(-1)! + 1];\n } else {\n const evaluationPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 2 : 1)];\n const entityToEvaluate = findPath(evaluationPath, query);\n if (isRuleGroup(entityToEvaluate)) {\n return [...evaluationPath, 0];\n } else {\n const targetPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 3 : 2)];\n return targetPath;\n }\n }\n }\n\n return currentPath;\n};\n\n/**\n * Options for {@link move}.\n *\n * @group Query Tools\n */\nexport interface MoveOptions {\n /**\n * When `true`, the source rule/group will not be removed from its original path.\n */\n clone?: boolean;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n * combinators), then the first combinator in this list will be inserted before\n * the rule/group if necessary.\n */\n combinators?: OptionList;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Moves a rule or group from one path to another. In the options parameter, pass\n * `{ clone: true }` to copy instead of move.\n * @returns The new query with the rule or group moved or cloned.\n *\n * @group Query Tools\n */\nexport const move = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** ID or original path of the rule or group to move. */\n oldPathOrID: Path | string,\n /** Path to move the rule or group to, or a shift direction. */\n newPath: Path | 'up' | 'down',\n /** Options. */\n { clone = false, combinators = defaultCombinators, idGenerator = generateID }: MoveOptions = {}\n): RG => {\n const oldPath = Array.isArray(oldPathOrID) ? oldPathOrID : getPathOfID(oldPathOrID, query);\n\n // Ignore invalid paths/ids\n if (!oldPath) return query;\n\n const nextPath = getNextPath(query, oldPath, newPath);\n\n // Don't move to the same location or a path that doesn't exist yet\n if (\n oldPath.length === 0 ||\n pathsAreEqual(oldPath, nextPath) ||\n !findPath(getParentPath(nextPath), query)\n ) {\n return query;\n }\n\n const ruleOrGroupOriginal = findPath(oldPath, query);\n if (!ruleOrGroupOriginal) {\n return query;\n }\n const ruleOrGroup = clone\n ? regenerateIDs(ruleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n : ruleOrGroupOriginal;\n\n return produce(query, draft => {\n const independentCombinators = isRuleGroupTypeIC(draft);\n const parentOfRuleToRemove = findPath(getParentPath(oldPath), draft) as RG;\n const ruleToRemoveIndex = oldPath.at(-1)!;\n const oldPrevCombinator =\n independentCombinators && ruleToRemoveIndex > 0\n ? (parentOfRuleToRemove.rules[ruleToRemoveIndex - 1] as string)\n : null;\n const oldNextCombinator =\n independentCombinators && ruleToRemoveIndex < parentOfRuleToRemove.rules.length - 1\n ? (parentOfRuleToRemove.rules[ruleToRemoveIndex + 1] as string)\n : null;\n\n // Remove the source item if not cloning\n if (!clone) {\n const idxStartDelete = independentCombinators\n ? Math.max(0, ruleToRemoveIndex - 1)\n : ruleToRemoveIndex;\n const deleteLength = independentCombinators ? 2 : 1;\n parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n }\n\n const newNewPath = [...nextPath];\n const commonAncestorPath = getCommonAncestorPath(oldPath, nextPath);\n if (\n !clone &&\n oldPath.length === commonAncestorPath.length + 1 &&\n nextPath[commonAncestorPath.length] > oldPath[commonAncestorPath.length]\n ) {\n // Getting here means there will be a shift of paths upward at the common\n // ancestor level because the object at `oldPath` will be spliced out. The\n // real new path should therefore be one or two higher than `newPathCalc`.\n newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n }\n const newNewParentPath = getParentPath(newNewPath);\n const parentToInsertInto = findPath(newNewParentPath, draft) as RG;\n const newIndex = newNewPath.at(-1)!;\n\n /**\n * This function 1) glosses over the need for type assertions to splice directly\n * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n const insertRuleOrGroup = (...args: any[]) =>\n parentToInsertInto.rules.splice(newIndex, 0, ...args);\n\n // Insert the source item at the target path\n if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n insertRuleOrGroup(ruleOrGroup);\n } else {\n if (newIndex === 0) {\n if (ruleToRemoveIndex === 0 && oldNextCombinator) {\n insertRuleOrGroup(ruleOrGroup, oldNextCombinator);\n } else {\n const newNextCombinator =\n parentToInsertInto.rules[1] ?? oldPrevCombinator ?? getFirstOption(combinators);\n insertRuleOrGroup(ruleOrGroup, newNextCombinator);\n }\n } else {\n if (oldPrevCombinator) {\n insertRuleOrGroup(oldPrevCombinator, ruleOrGroup);\n } else {\n const newPrevCombinator =\n parentToInsertInto.rules[newIndex - 2] ??\n oldNextCombinator ??\n getFirstOption(combinators);\n insertRuleOrGroup(newPrevCombinator, ruleOrGroup);\n }\n }\n }\n });\n};\n\n/**\n * Options for {@link insert}.\n *\n * @group Query Tools\n */\nexport interface InsertOptions {\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then the first combinator in this list will be inserted\n * before the new rule/group if the parent group is not empty. This option\n * is overridden by `combinatorPreceding`.\n */\n combinators?: OptionList;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted before the new rule/group\n * if the parent group is not empty and the new rule/group is not the first in the\n * group (`path.at(-1) > 0`). This option will supersede `combinators`.\n */\n combinatorPreceding?: string;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted after the new rule/group\n * if the parent group is not empty and the new rule/group is the first in the\n * group (`path.at(-1) === 0`). This option will supersede `combinators`.\n */\n combinatorSucceeding?: string;\n /**\n * ID generator.\n *\n * @default generateID\n */\n idGenerator?: () => string;\n /**\n * When `true`, the new rule/group will replace the rule/group at `path`.\n */\n replace?: boolean;\n}\n/**\n * Inserts a rule or group into a query.\n * @returns The new query with the rule or group inserted.\n *\n * @group Query Tools\n */\nexport const insert = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The rule or group to insert. */\n ruleOrGroup: RG | RuleType,\n /** Path at which to insert the rule or group. */\n path: number[],\n /** Options. */\n {\n combinators = defaultCombinators,\n combinatorPreceding,\n combinatorSucceeding,\n idGenerator = generateID,\n replace = false,\n }: InsertOptions = {}\n): RG =>\n produce(query, draft => {\n const parentToInsertInto = findPath(getParentPath(path), draft) as RG;\n if (!parentToInsertInto || !isRuleGroup(parentToInsertInto)) return;\n\n const rorg = regenerateIDs(ruleOrGroup as RuleGroupTypeAny, { idGenerator });\n const independentCombinators = isRuleGroupTypeIC(draft);\n const newIndex = path.at(-1)!;\n\n /**\n * This function 1) glosses over the need for type assertions to splice directly\n * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n const insertRuleOrGroup = (idx: number, ...args: any[]) =>\n parentToInsertInto.rules.splice(idx, replace ? args.length : 0, ...args);\n\n // Insert the source item at the target path\n if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n insertRuleOrGroup(newIndex, rorg);\n } else if (replace && independentCombinators) {\n insertRuleOrGroup(newIndex + (newIndex % 2), rorg);\n } else {\n if (newIndex === 0) {\n if (rorg.path?.at(-1) === 0 && combinatorSucceeding) {\n insertRuleOrGroup(newIndex, rorg, combinatorSucceeding);\n } else {\n const newNextCombinator =\n parentToInsertInto.rules[1] ?? combinatorPreceding ?? getFirstOption(combinators);\n insertRuleOrGroup(newIndex, rorg, newNextCombinator);\n }\n } else {\n const normalizedNewIndex = newIndex % 2 === 0 ? newIndex - 1 : newIndex;\n if (combinatorPreceding) {\n insertRuleOrGroup(normalizedNewIndex, combinatorPreceding, rorg);\n } else {\n const newPrevCombinator =\n parentToInsertInto.rules[normalizedNewIndex - 2] ??\n combinatorSucceeding ??\n getFirstOption(combinators);\n insertRuleOrGroup(normalizedNewIndex, newPrevCombinator, rorg);\n }\n }\n }\n });\n\n/**\n * Options for {@link group}.\n *\n * @group Query Tools\n */\nexport interface GroupOptions {\n /**\n * When `true`, the source rule/group will not be removed from its original path.\n */\n clone?: boolean;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n * combinators), then the first combinator in this list will be inserted between\n * the two rules/groups.\n */\n combinators?: OptionList;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Creates a new group at a target path with its `rules` array containing the current\n * objects at the target path and the source path. In the options parameter, pass\n * `{ clone: true }` to copy the source rule/group instead of move.\n *\n * @returns The new query with the rules or groups grouped.\n *\n * @group Query Tools\n */\nexport const group = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** Path of the rule/group to move or clone. */\n sourcePathOrID: Path | string,\n /** Path of the target rule/group, which will become the path of the new group. */\n targetPathOrID: Path | string,\n /** Options. */\n { clone = false, combinators = defaultCombinators, idGenerator = generateID }: GroupOptions = {}\n): RG => {\n const sourcePath = Array.isArray(sourcePathOrID)\n ? sourcePathOrID\n : getPathOfID(sourcePathOrID, query);\n const targetPath = Array.isArray(targetPathOrID)\n ? targetPathOrID\n : getPathOfID(targetPathOrID, query);\n\n // Ignore invalid paths/ids\n if (!sourcePath || !targetPath) return query;\n\n const nextPath = getNextPath(query, sourcePath, targetPath);\n\n // Don't move to the same location or a path that doesn't exist yet\n if (\n sourcePath.length === 0 ||\n pathsAreEqual(sourcePath, nextPath) ||\n !findPath(getParentPath(nextPath), query)\n ) {\n return query;\n }\n\n const sourceRuleOrGroupOriginal = findPath(sourcePath, query);\n const targetRuleOrGroup = findPath(targetPath, query);\n if (!sourceRuleOrGroupOriginal || !targetRuleOrGroup) {\n return query;\n }\n const sourceRuleOrGroup = clone\n ? regenerateIDs(sourceRuleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n : sourceRuleOrGroupOriginal;\n\n return produce(query, draft => {\n const independentCombinators = isRuleGroupTypeIC(draft);\n const parentOfRuleToRemove = findPath(getParentPath(sourcePath), draft) as RG;\n const ruleToRemoveIndex = sourcePath.at(-1)!;\n\n // Remove the source item if not cloning\n if (!clone) {\n const idxStartDelete = independentCombinators\n ? Math.max(0, ruleToRemoveIndex - 1)\n : ruleToRemoveIndex;\n const deleteLength = independentCombinators ? 2 : 1;\n parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n }\n\n const newNewPath = [...nextPath];\n const commonAncestorPath = getCommonAncestorPath(sourcePath, nextPath);\n if (\n !clone &&\n sourcePath.length === commonAncestorPath.length + 1 &&\n nextPath[commonAncestorPath.length] > sourcePath[commonAncestorPath.length]\n ) {\n // Getting here means there will be a shift of paths upward at the common\n // ancestor level because the object at `oldPath` will be spliced out. The\n // real new path should therefore be one or two higher than `newPathCalc`.\n newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n }\n const newNewParentPath = getParentPath(newNewPath);\n const parentOfTargetPath = findPath(newNewParentPath, draft) as RG;\n const targetPathIndex = newNewPath.at(-1)!;\n\n // Convert the target path to a group and insert the source and target items as children\n parentOfTargetPath.rules.splice(\n targetPathIndex,\n 1,\n prepareRuleOrGroup(\n (independentCombinators\n ? { rules: [targetRuleOrGroup, getFirstOption(combinators), sourceRuleOrGroup] }\n : {\n combinator: getFirstOption(combinators),\n rules: [targetRuleOrGroup, sourceRuleOrGroup],\n // oxlint-disable-next-line typescript/no-explicit-any\n }) as any,\n { idGenerator }\n // oxlint-disable-next-line typescript/no-explicit-any\n ) as any\n );\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"react-querybuilder_core.mjs","names":["defaultPlaceholderFieldName: typeof defaultPlaceholderName","defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel","defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorName: typeof defaultPlaceholderName","defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueName: typeof defaultPlaceholderName","defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel","defaultTranslations: BaseTranslationsFull","defaultOperatorLabelMap: Record<DefaultOperatorName, string>","defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string>","defaultOperators: DefaultOperators","defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName>","defaultCombinators: DefaultCombinators","defaultCombinatorsExtended: DefaultCombinatorsExtended","defaultMatchModes: DefaultMatchModes","defaultControlClassnames: Classnames","rootPath: Path","queryBuilderFlagDefaults: Required<QueryBuilderFlags>","v","numericRegex: RegExp","numericQuantityRegex","rules: (RuleGroupTypeIC | RuleType | string)[]","defaultValidator: QueryValidator","result: ValidationMap","reasons: any[]","idObj: { name?: string; value?: string }","newArray: T[]","newArray: OptionGroup<ToFullOption<T>>[]","optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[]","optionList: O[] | OptionGroup<O>[]","optionsMap: Partial<FullOptionRecord<FullOption>>","valAsNum: number | bigint","celCombinatorMap: {\n and: '&&';\n or: '||';\n}","jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n>","result: string[]","defaultNLTranslations: NLTranslations","defaultRuleGroupProcessorCEL: RuleGroupProcessor<string>","shouldNegate","defaultRuleProcessorCEL: RuleProcessor","defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor","expressions: Record<string, unknown>[]","processNumber","defaultRuleProcessorMongoDBQuery: RuleProcessor","defaultRuleProcessorMongoDB: RuleProcessor","defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string>","shouldNegate","negate","defaultRuleProcessorSpEL: RuleProcessor","escapeStringValueQuotes","defaultValueProcessorByRule: ValueProcessorByRule","defaultRuleProcessorDrizzle: RuleProcessor","defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n>","ruleGroupSQL: SQL | undefined","defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>>","defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string>","defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic>","jsonRuleGroup: RQBJsonLogic","defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string>","rules: string[]","defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string>","expressions: string[]","defaultRuleGroupProcessorNL: RuleGroupProcessor<string>","defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n>","params: any[]","paramsNamed: Record<string, any>","fieldParams: Map<string, Set<string>>","defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSQL: RuleGroupProcessor<string>","negateIfNotOp","textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>>","defaultRuleProcessorElasticSearch: RuleProcessor","negate","defaultRuleProcessorJSONata: RuleProcessor","defaultRuleProcessorJsonLogic: RuleProcessor","fieldObject: JsonLogicVar","negate","defaultRuleProcessorLDAP: RuleProcessor","defaultValueProcessorNL: ValueProcessorByRule","defaultExportOperatorMap: ExportOperatorMap","defaultOperatorProcessorNL: RuleProcessor","defaultRuleProcessorNL: RuleProcessor","defaultOperatorProcessorSQL: RuleProcessor","defaultRuleProcessorSQL: RuleProcessor","defaultRuleProcessorParameterized: RuleProcessor","params: any[]","paramsNamed: Record<string, any>","inParams: string[]","defaultRuleProcessorPrisma: RuleProcessor","defaultRuleProcessorSequelize: RuleProcessor","sqlDialectPresets: Record<SQLPreset, FormatQueryOptions>","formatQueryOptionPresets: Record<string, FormatQueryOptions>","defaultOperatorProcessor: RuleProcessor","defaultFallbackExpressions: Partial<Record<ExportFormat, string>>","optObj: MostFormatQueryOptions","valueProcessor: ValueProcessorByRule","getOperators: FormatQueryOptions['getOperators']","validationMap: ValidationMap","validatorMap: Record<string, RuleValidator>","validationResult: boolean | ValidationResult | undefined","fieldValidator: RuleValidator | undefined","finalOptions: FormatQueryFinalOptions","defaultValueProcessor: ValueProcessorLegacy","defaultMongoDBValueProcessor: ValueProcessorLegacy","defaultCELValueProcessor: ValueProcessorLegacy","defaultSpELValueProcessor: ValueProcessorLegacy","defaultValueProcessorCELByRule: RuleProcessor","defaultValueProcessorMongoDBByRule: RuleProcessor","defaultValueProcessorSpELByRule: RuleProcessor","target: FindPathReturnType","t: RuleGroupTypeAny | RuleType | string","commonAncestorPath: Path","target: RuleType | RuleGroupTypeAny","generateAccessibleDescription: ADG","dummyFD","matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[]","defaultValueSourcesArray: ValueSourceFullOptions","valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions)"],"sources":["../src/defaults.ts","../src/utils/arrayUtils.ts","../src/utils/clsx.ts","../src/utils/misc.ts","../src/utils/isRuleGroup.ts","../src/utils/convertQuery.ts","../src/utils/defaultValidator.ts","../src/utils/objectUtils.ts","../src/utils/optGroupUtils.ts","../src/utils/filterFieldsByComparator.ts","../src/utils/parseNumber.ts","../src/utils/transformQuery.ts","../src/utils/isRuleOrGroupValid.ts","../src/utils/getParseNumberMethod.ts","../src/utils/formatQuery/utils.ts","../src/utils/formatQuery/defaultRuleGroupProcessorCEL.ts","../src/utils/formatQuery/defaultRuleProcessorCEL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSpEL.ts","../src/utils/formatQuery/defaultRuleProcessorSpEL.ts","../src/utils/formatQuery/defaultValueProcessorByRule.ts","../src/utils/formatQuery/defaultRuleProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleGroupProcessorLDAP.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorNL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleGroupProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSequelize.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleProcessorLDAP.ts","../src/utils/formatQuery/defaultValueProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleProcessorSequelize.ts","../src/utils/formatQuery/formatQuery.ts","../src/utils/formatQuery/index.ts","../src/utils/pathUtils.ts","../src/utils/generateAccessibleDescription.ts","../src/utils/generateID.ts","../src/utils/getMatchModesUtil.ts","../src/utils/getValidationClassNames.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/mergeAnyTranslations.ts","../src/utils/mergeClassnames.ts","../src/utils/preferProp.ts","../src/utils/prepareQueryObjects.ts","../src/utils/regenerateIDs.ts","../src/utils/queryTools.ts"],"sourcesContent":["import type {\n BaseTranslationsFull,\n Classnames,\n DefaultCombinatorName,\n DefaultCombinatorNameExtended,\n DefaultOperatorName,\n MatchMode,\n Path,\n QueryBuilderFlags,\n StringUnionToFullOptionArray,\n} from './types';\n\n// DO NOT ALTER OR REMOVE REGION NAMES. Some of them are used\n// to generate code snippets in the documentation.\n\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderName = '~';\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderLabel = '------';\n/**\n * Default `name` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n\n/**\n * Default configuration of translatable strings.\n *\n * @group Defaults\n */\n// #region docs-translations\nexport const defaultTranslations: BaseTranslationsFull = {\n fields: {\n title: 'Field',\n placeholderName: defaultPlaceholderFieldName,\n placeholderLabel: defaultPlaceholderFieldLabel,\n placeholderGroupLabel: defaultPlaceholderFieldGroupLabel,\n } as const,\n operators: {\n title: 'Operator',\n placeholderName: defaultPlaceholderOperatorName,\n placeholderLabel: defaultPlaceholderOperatorLabel,\n placeholderGroupLabel: defaultPlaceholderOperatorGroupLabel,\n } as const,\n values: {\n title: 'Values',\n placeholderName: defaultPlaceholderValueName,\n placeholderLabel: defaultPlaceholderValueLabel,\n placeholderGroupLabel: defaultPlaceholderValueGroupLabel,\n } as const,\n matchMode: { title: 'Match mode' } as const,\n matchThreshold: { title: 'Match threshold' } as const,\n value: { title: 'Value' } as const,\n removeRule: { label: '⨯', title: 'Remove rule' } as const,\n removeGroup: { label: '⨯', title: 'Remove group' } as const,\n addRule: { label: '+ Rule', title: 'Add rule' } as const,\n addGroup: { label: '+ Group', title: 'Add group' } as const,\n combinators: { title: 'Combinator' } as const,\n notToggle: { label: 'Not', title: 'Invert this group' } as const,\n cloneRule: { label: '⧉', title: 'Clone rule' } as const,\n cloneRuleGroup: { label: '⧉', title: 'Clone group' } as const,\n shiftActionUp: { label: '˄', title: 'Shift up' } as const,\n shiftActionDown: { label: '˅', title: 'Shift down' } as const,\n dragHandle: { label: '⁞⁞', title: 'Drag handle' } as const,\n lockRule: { label: '🔓', title: 'Lock rule' } as const,\n lockGroup: { label: '🔓', title: 'Lock group' } as const,\n lockRuleDisabled: { label: '🔒', title: 'Unlock rule' } as const,\n lockGroupDisabled: { label: '🔒', title: 'Unlock group' } as const,\n muteRule: { label: '🔊', title: 'Mute rule' } as const,\n muteGroup: { label: '🔊', title: 'Mute group' } as const,\n unmuteRule: { label: '🔇', title: 'Unmute rule' } as const,\n unmuteGroup: { label: '🔇', title: 'Unmute group' } as const,\n valueSourceSelector: { title: 'Value source' } as const,\n} satisfies BaseTranslationsFull;\n// #endregion\n\n/**\n * Default character used to `.join` and `.split` arrays.\n *\n * @group Defaults\n */\nexport const defaultJoinChar = ',';\n\nexport type DefaultOperators = StringUnionToFullOptionArray<DefaultOperatorName>;\n\nexport const defaultOperatorLabelMap: Record<DefaultOperatorName, string> = {\n '=': '=',\n '!=': '!=',\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n contains: 'contains',\n beginsWith: 'begins with',\n endsWith: 'ends with',\n doesNotContain: 'does not contain',\n doesNotBeginWith: 'does not begin with',\n doesNotEndWith: 'does not end with',\n null: 'is null',\n notNull: 'is not null',\n in: 'in',\n notIn: 'not in',\n between: 'between',\n notBetween: 'not between',\n};\n\nexport const defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string> = {\n and: 'AND',\n or: 'OR',\n xor: 'XOR',\n};\n\n/**\n * Default operator list.\n *\n * @group Defaults\n */\n// #region docs-operators\nexport const defaultOperators: DefaultOperators = [\n { name: '=', value: '=', label: '=' },\n { name: '!=', value: '!=', label: '!=' },\n { name: '<', value: '<', label: '<' },\n { name: '>', value: '>', label: '>' },\n { name: '<=', value: '<=', label: '<=' },\n { name: '>=', value: '>=', label: '>=' },\n { name: 'contains', value: 'contains', label: 'contains' },\n { name: 'beginsWith', value: 'beginsWith', label: 'begins with' },\n { name: 'endsWith', value: 'endsWith', label: 'ends with' },\n { name: 'doesNotContain', value: 'doesNotContain', label: 'does not contain' },\n { name: 'doesNotBeginWith', value: 'doesNotBeginWith', label: 'does not begin with' },\n { name: 'doesNotEndWith', value: 'doesNotEndWith', label: 'does not end with' },\n { name: 'null', value: 'null', label: 'is null' },\n { name: 'notNull', value: 'notNull', label: 'is not null' },\n { name: 'in', value: 'in', label: 'in' },\n { name: 'notIn', value: 'notIn', label: 'not in' },\n { name: 'between', value: 'between', label: 'between' },\n { name: 'notBetween', value: 'notBetween', label: 'not between' },\n];\n// #endregion\n\n/**\n * Map of default operators to their respective opposite/negating operators.\n *\n * @group Defaults\n */\nexport const defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName> = {\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} satisfies Record<DefaultOperatorName, DefaultOperatorName>;\n\nexport type DefaultCombinators = StringUnionToFullOptionArray<DefaultCombinatorName>;\n\n/**\n * Default combinator list.\n *\n * @group Defaults\n */\n// #region docs-combinators\nexport const defaultCombinators: DefaultCombinators = [\n { name: 'and', value: 'and', label: 'AND' } as const,\n { name: 'or', value: 'or', label: 'OR' } as const,\n];\n// #endregion\n\nexport type DefaultCombinatorsExtended =\n StringUnionToFullOptionArray<DefaultCombinatorNameExtended>;\n\n/**\n * Default combinator list, with `XOR` added.\n *\n * @group Defaults\n */\nexport const defaultCombinatorsExtended: DefaultCombinatorsExtended = [\n ...defaultCombinators,\n { name: 'xor', value: 'xor', label: 'XOR' } as const,\n];\n\nexport type DefaultMatchModes = StringUnionToFullOptionArray<MatchMode>;\n\n/**\n * Default match modes.\n *\n * @group Defaults\n */\n// #region docs-matchmodes\nexport const defaultMatchModes: DefaultMatchModes = [\n { name: 'all', value: 'all', label: 'all' },\n { name: 'some', value: 'some', label: 'some' },\n { name: 'none', value: 'none', label: 'none' },\n { name: 'atLeast', value: 'atLeast', label: 'at least' },\n { name: 'atMost', value: 'atMost', label: 'at most' },\n { name: 'exactly', value: 'exactly', label: 'exactly' },\n];\n// #endregion\n\n/**\n * Standard classnames applied to each component.\n *\n * @group Defaults\n */\n// #region docs-standardclassnames\nexport const 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 matchMode: 'rule-matchMode',\n matchThreshold: 'rule-matchThreshold',\n operators: 'rule-operators',\n value: 'rule-value',\n removeRule: 'rule-remove',\n betweenRules: 'betweenRules',\n valid: 'queryBuilder-valid',\n invalid: 'queryBuilder-invalid',\n shiftActions: 'shiftActions',\n dndDragging: 'dndDragging',\n dndOver: 'dndOver',\n dndCopy: 'dndCopy',\n dndGroup: 'dndGroup',\n dndDropNotAllowed: 'dndDropNotAllowed',\n dragHandle: 'queryBuilder-dragHandle',\n disabled: 'queryBuilder-disabled',\n muted: 'queryBuilder-muted',\n lockRule: 'rule-lock',\n lockGroup: 'ruleGroup-lock',\n muteRule: 'rule-mute',\n muteGroup: 'ruleGroup-mute',\n valueSource: 'rule-valueSource',\n valueListItem: 'rule-value-list-item',\n branches: 'queryBuilder-branches',\n justified: 'queryBuilder-justified',\n hasSubQuery: 'rule-hasSubQuery',\n} as const;\n// #endregion\n\n/**\n * Default classnames for each component.\n *\n * @group Defaults\n */\nexport const defaultControlClassnames: Classnames = {\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 matchMode: '',\n matchThreshold: '',\n operators: '',\n value: '',\n removeRule: '',\n shiftActions: '',\n dragHandle: '',\n lockRule: '',\n lockGroup: '',\n muteRule: '',\n muteGroup: '',\n muted: '',\n valueSource: '',\n actionElement: '',\n valueSelector: '',\n betweenRules: '',\n valid: '',\n invalid: '',\n dndDragging: '',\n dndOver: '',\n dndGroup: '',\n dndCopy: '',\n dndDropNotAllowed: '',\n disabled: '',\n valueListItem: '',\n branches: '',\n hasSubQuery: '',\n} satisfies Classnames;\n\n/**\n * Default reason codes for a group being invalid.\n *\n * @group Defaults\n */\nexport const groupInvalidReasons = {\n empty: 'empty',\n invalidCombinator: 'invalid combinator',\n invalidIndependentCombinators: 'invalid independent combinators',\n} as const;\n\n/**\n * Component identifiers for testing.\n *\n * @group Defaults\n */\nexport const 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 shiftActions: 'shift-actions',\n dragHandle: 'drag-handle',\n lockRule: 'lock-rule',\n lockGroup: 'lock-group',\n muteRule: 'mute-rule',\n muteGroup: 'mute-group',\n valueSourceSelector: 'value-source-selector',\n matchModeEditor: 'match-mode-editor',\n} as const;\n\nexport const 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 onGroupRuleFalse: 'onGroupRule callback returned false',\n onGroupGroupFalse: 'onGroupGroup callback returned false',\n onMoveRuleFalse: 'onMoveRule callback returned false',\n onMoveGroupFalse: 'onMoveGroup 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 group: 'rule or group grouped with another',\n} as const;\n\n/**\n * The {@link Path} of the root group.\n *\n * @group Defaults\n */\nexport const rootPath: Path = [] satisfies Path;\n\n/**\n * Default values for all `boolean`\n * {@link react-querybuilder!QueryBuilder QueryBuilder} options.\n *\n * @group Defaults\n */\nexport const queryBuilderFlagDefaults: Required<QueryBuilderFlags> = {\n addRuleToNewGroups: false,\n autoSelectField: true,\n autoSelectOperator: true,\n autoSelectValue: false,\n debugMode: false,\n enableDragAndDrop: false,\n enableMountQueryChange: true,\n listsAsArrays: false,\n resetOnFieldChange: true,\n resetOnOperatorChange: false,\n showCloneButtons: false,\n showCombinatorsBetweenRules: false,\n showLockButtons: false,\n showMuteButtons: false,\n showNotToggle: false,\n showShiftActions: false,\n suppressStandardClassnames: false,\n};\n","import { defaultJoinChar } from '../defaults';\n\n/**\n * Splits a string by a given character (see {@link defaultJoinChar}). Escaped characters\n * (characters preceded by a backslash) will not apply to the split, and the backslash will\n * be removed in the array element. Inverse of {@link joinWith}.\n *\n * @example\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,')\n * // or\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,', ',')\n * // would return\n * ['this,,that', '', 'the other', '', '', ',']\n */\nexport const splitBy = (str?: string, splitChar: string = defaultJoinChar): string[] =>\n typeof str === 'string'\n ? str\n .split(`\\\\${splitChar}`)\n .map(c => c.split(splitChar))\n .reduce((prev, curr, idx) => {\n if (idx === 0) {\n return curr;\n }\n return [...prev.slice(0, -1), `${prev.at(-1)}${splitChar}${curr[0]}`, ...curr.slice(1)];\n }, [])\n : [];\n\n/**\n * Joins an array of strings using the given character (see {@link defaultJoinChar}). When\n * the given character appears in an array element, a backslash will be added just before it\n * to distinguish it from the join character. Effectively the inverse of {@link splitBy}.\n *\n * TIP: The join character can actually be a string of any length. Only the first character\n * will be searched for in the array elements and preceded by a backslash.\n *\n * @example\n * joinWith(['this,,that', '', 'the other', '', '', ','], ', ')\n * // would return\n * 'this\\\\,\\\\,that, , the other, , , \\\\,'\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const joinWith = (strArr: any[], joinChar: string = defaultJoinChar): string =>\n strArr.map(str => `${str ?? ''}`.replaceAll(joinChar[0], `\\\\${joinChar[0]}`)).join(joinChar);\n\n/**\n * Trims the value if it is a string. Otherwise returns the value as is.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const trimIfString = (val: any): any => (typeof val === 'string' ? val.trim() : val);\n\n/**\n * Splits a string by comma then trims each element. Arrays are returned as is except\n * any string elements are trimmed.\n */\nexport const toArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n v: any,\n { retainEmptyStrings }: { retainEmptyStrings?: boolean } = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any[] =>\n Array.isArray(v)\n ? v.map(v => trimIfString(v))\n : typeof v === 'string'\n ? splitBy(v, defaultJoinChar)\n .filter(retainEmptyStrings ? () => true : s => !/^\\s*$/.test(s))\n .map(s => s.trim())\n : typeof v === 'number'\n ? [v]\n : [];\n\n/**\n * Determines if an array is free of `null`/`undefined`.\n */\nexport const nullFreeArray = <T>(arr: T[]): arr is Exclude<T, null>[] =>\n arr.every(el => el === false || (el ?? false) !== false);\n","// Adapted from https://github.com/lukeed/clsx/tree/925494cf31bcd97d3337aacd34e659e80cae7fe2\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ClassDictionary = Record<string, any>;\ntype ClassValue =\n | ClassArray\n | ClassDictionary\n | string\n | number\n | bigint\n | null\n | boolean\n | undefined;\ntype ClassArray = ClassValue[];\n\n// istanbul ignore next\n// oxlint-disable-next-line typescript/no-explicit-any\nfunction toVal(mix: any) {\n let k;\n let y;\n let str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n const len = mix.length;\n for (k = 0; k < len; k++) {\n if (mix[k] && (y = toVal(mix[k]))) {\n // oxlint-disable-next-line no-unused-expressions\n str && (str += ' ');\n str += y;\n }\n }\n } else {\n for (y in mix) {\n if (mix[y]) {\n // oxlint-disable-next-line no-unused-expressions\n str && (str += ' ');\n str += y;\n }\n }\n }\n }\n\n return str;\n}\n\n/**\n * Vendored/adapted version of the `clsx` package.\n *\n * **NOTE:** Prefer the official package from npm outside the context of React Query Builder.\n */\n// istanbul ignore next\nexport function clsx(...args: ClassValue[]): string {\n let i = 0;\n let tmp;\n let x;\n let str = '';\n const len = args.length;\n for (; i < len; i++) {\n if ((tmp = args[i]) && (x = toVal(tmp))) {\n // oxlint-disable-next-line no-unused-expressions\n str && (str += ' ');\n str += x;\n }\n }\n return str;\n}\n\nexport default clsx;\n","import { numericRegex as numericQuantityRegex } from 'numeric-quantity';\n\n/**\n * Converts a value to lowercase if it's a string, otherwise returns the value as is.\n */\n// istanbul ignore next\nexport const lc = <T>(v: T): T => (typeof v === 'string' ? (v.toLowerCase() as T) : v);\n\n/**\n * Regex matching numeric strings. Passes for positive/negative integers, decimals,\n * and E notation, with optional surrounding whitespace.\n */\nexport const numericRegex: RegExp = new RegExp(\n numericQuantityRegex.source.replace(/^\\^/, String.raw`^\\s*`).replace(/\\$$/, String.raw`\\s*$`)\n);\n\n/**\n * Determines if a variable is a plain old JavaScript object, aka POJO.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isPojo = (obj: any): obj is Record<string, any> =>\n obj === null || typeof obj !== 'object' ? false : Object.getPrototypeOf(obj) === Object.prototype;\n\n/**\n * Simple helper to determine whether a value is null, undefined, or an empty string.\n */\nexport const nullOrUndefinedOrEmpty = (value: unknown): value is null | undefined | '' =>\n value === null || value === undefined || value === '';\n","import type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is a {@link RuleType} (only checks for a `field` property).\n */\nexport const isRuleType = (s: unknown): s is RuleType =>\n isPojo(s) && 'field' in s && typeof s.field === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupType} or {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroup = (rg: unknown): rg is RuleGroupTypeAny =>\n isPojo(rg) && Array.isArray(rg.rules);\n\n/**\n * Determines if an object is a {@link RuleGroupType}.\n */\nexport const isRuleGroupType = (rg: unknown): rg is RuleGroupType =>\n isRuleGroup(rg) && typeof rg.combinator === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroupTypeIC = (rg: unknown): rg is RuleGroupTypeIC =>\n isRuleGroup(rg) && rg.combinator === undefined;\n","import { produce } from 'immer';\nimport type {\n RuleGroupArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { lc } from './misc';\n\nconst combinatorLevels = ['or', 'xor', 'and'] as const;\n\nconst isSameString = (a: unknown, b: string) => lc(a) === b;\n\nconst generateRuleGroupICWithConsistentCombinators = (\n rg: RuleGroupTypeIC,\n baseCombinatorLevel: number = 0\n): RuleGroupTypeIC => {\n const baseCombinator = combinatorLevels[baseCombinatorLevel];\n\n // oxlint-disable-next-line typescript/no-explicit-any\n if (!rg.rules.includes(baseCombinator as any)) {\n // No instances of this combinator, so group based on the next\n // combinator level if at least two levels remain\n return baseCombinatorLevel < combinatorLevels.length - 2\n ? generateRuleGroupICWithConsistentCombinators(rg, baseCombinatorLevel + 1)\n : rg;\n }\n\n return produce(rg, draft => {\n let cursor = 0;\n\n // Group all chains of combinators in the rule array that are not the base combinator\n while (cursor < draft.rules.length - 2) {\n if (isSameString(draft.rules[cursor + 1], baseCombinator)) {\n cursor += 2;\n continue;\n }\n\n const nextBaseCombinatorIndex = draft.rules.findIndex(\n (r, i) => i > cursor && typeof r === 'string' && lc(r) === baseCombinator\n );\n\n if (nextBaseCombinatorIndex === -1) {\n // No more instances of this combinator, so group all remaining rules and exit the loop\n draft.rules.splice(\n cursor,\n draft.rules.length,\n generateRuleGroupICWithConsistentCombinators(\n // oxlint-disable-next-line typescript/no-explicit-any\n { rules: draft.rules.slice(cursor) as any },\n baseCombinatorLevel + 1\n )\n );\n break;\n } else {\n // Group all rules between the current cursor and the next instance of the base combinator\n draft.rules.splice(\n cursor,\n nextBaseCombinatorIndex - cursor,\n generateRuleGroupICWithConsistentCombinators(\n // oxlint-disable-next-line typescript/no-explicit-any\n { rules: draft.rules.slice(cursor, nextBaseCombinatorIndex) as any },\n baseCombinatorLevel + 1\n )\n );\n }\n }\n });\n};\n\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}.\n *\n * This function is idempotent: {@link RuleGroupType} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertFromIC = <RG extends RuleGroupType = RuleGroupType>(\n rg: RuleGroupTypeAny\n): RG => {\n if (isRuleGroupType(rg)) {\n return rg as RG;\n }\n const processedRG = generateRuleGroupICWithConsistentCombinators(rg);\n const rulesAsMixedList = processedRG.rules.map(r =>\n typeof r === 'string' || !isRuleGroup(r) ? r : convertFromIC(r)\n );\n const combinator = rulesAsMixedList.length < 2 ? 'and' : (rulesAsMixedList[1] as string);\n const rules = rulesAsMixedList.filter(r => typeof r !== 'string') as RuleGroupArray;\n return { ...processedRG, combinator, rules } as RG;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}.\n *\n * This function is idempotent: {@link RuleGroupTypeIC} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertToIC = <RGIC extends RuleGroupTypeIC = RuleGroupTypeIC>(\n rg: RuleGroupTypeAny\n): RGIC => {\n if (isRuleGroupTypeIC(rg)) {\n return rg as RGIC;\n }\n const { combinator, ...queryWithoutCombinator } = rg;\n const rules: (RuleGroupTypeIC | RuleType | string)[] = [];\n const { length } = rg.rules;\n for (const [idx, r] of rg.rules.entries()) {\n if (isRuleGroup(r)) {\n rules.push(convertToIC(r));\n } else {\n rules.push(r);\n }\n if (combinator && idx < length - 1) {\n rules.push(combinator);\n }\n }\n return { ...queryWithoutCombinator, rules } as RGIC;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}. For a more explicit\n * operation, use {@link convertToIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupType): RuleGroupTypeIC;\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}. For a more explicit\n * operation, use {@link convertFromIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupTypeIC): RuleGroupType;\nfunction convertQuery(query: RuleGroupType | RuleGroupTypeIC): RuleGroupType | RuleGroupTypeIC {\n return isRuleGroupTypeIC(query) ? convertFromIC(query) : convertToIC(query);\n}\n\nexport { convertQuery };\n","import { defaultCombinators, groupInvalidReasons } from '../defaults';\nimport type { QueryValidator, RuleGroupTypeAny, RuleType, ValidationMap } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\n/**\n * This is an example validation function you can pass to {@link react-querybuilder!QueryBuilder QueryBuilder} in the\n * `validator` prop. It assumes that you want to validate groups, and has a no-op\n * for validating rules which you can replace with your own implementation.\n */\nexport const defaultValidator: QueryValidator = query => {\n const result: ValidationMap = {};\n\n /**\n * Replace this with your custom rule validator.\n */\n const validateRule = (rule: RuleType) => {\n // Set `result[rule.id] = true` for a valid rule, or either\n // `{ valid: false, reasons: ['whatever', 'reasons', 'here'] }`\n // or simply `false` for an invalid rule.\n // istanbul ignore else\n // oxlint-disable-next-line no-unused-expressions\n if (rule.id) result[rule.id]; // = true;\n };\n\n const validateGroup = (rg: RuleGroupTypeAny) => {\n // oxlint-disable-next-line typescript/no-explicit-any\n const reasons: any[] = [];\n if (rg.rules.length === 0) {\n reasons.push(groupInvalidReasons.empty);\n } else if (!isRuleGroupType(rg)) {\n // Odd indexes should be valid combinators and even indexes should be rules or groups\n let invalidICs = false;\n for (let i = 0; i < rg.rules.length && !invalidICs; i++) {\n if (\n (i % 2 === 0 && typeof rg.rules[i] === 'string') ||\n (i % 2 === 1 && typeof rg.rules[i] !== 'string') ||\n (i % 2 === 1 &&\n typeof rg.rules[i] === 'string' &&\n !defaultCombinators.map(c => c.name as string).includes(rg.rules[i] as string))\n ) {\n invalidICs = true;\n }\n }\n if (invalidICs) {\n reasons.push(groupInvalidReasons.invalidIndependentCombinators);\n }\n }\n // Non-independent combinators should be valid, but only checked if there are multiple rules\n // since combinators don't really apply to groups with only one rule/group\n if (\n isRuleGroupType(rg) &&\n !defaultCombinators.map(c => c.name as string).includes(rg.combinator) &&\n rg.rules.length > 1\n ) {\n reasons.push(groupInvalidReasons.invalidCombinator);\n }\n /* istanbul ignore else */\n if (rg.id) {\n result[rg.id] = reasons.length > 0 ? { valid: false, reasons } : true;\n }\n for (const r of rg.rules) {\n if (typeof r === 'string') {\n // Validation for this case was done earlier\n } else if (isRuleGroup(r)) {\n validateGroup(r);\n } else {\n validateRule(r);\n }\n }\n };\n\n validateGroup(query);\n\n return result;\n // You can return the result object itself like above, or if you just\n // want the entire query to be marked invalid if _any_ rules/groups are\n // invalid, return a boolean like this:\n // return Object.values(result).map(rv => (typeof rv !== 'boolean')).includes(true);\n // That will return `true` if no errors were found.\n};\n","// All code in this file is adapted from:\n// npm: https://www.npmjs.com/package/ts-extras\n// src: https://github.com/sindresorhus/ts-extras\n\n/**\n * Original looked like this (not sure why template string is used):\n * ```\n * type ObjectKeys<T extends object> = `${Exclude<keyof T, symbol>}`;\n * ```\n */\ntype ObjectKeys<T extends object> = Exclude<keyof T, symbol>;\n\n/**\n * A strongly-typed version of `Object.keys()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-keys.ts)\n */\nexport const objectKeys = Object.keys as <Type extends object>(\n value: Type\n) => Array<ObjectKeys<Type>>;\n\n/**\n * A strongly-typed version of `Object.entries()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-entries.ts)\n */\nexport const objectEntries = Object.entries as <Type extends Record<PropertyKey, unknown>>(\n value: Type\n) => Array<[ObjectKeys<Type>, Type[ObjectKeys<Type>]]>;\n","import type { Draft } from 'immer';\nimport { produce } from 'immer';\nimport type { RequireAtLeastOne } from 'type-fest';\nimport { defaultPlaceholderLabel, defaultPlaceholderName } from '../defaults';\nimport type {\n BaseOption,\n BaseOptionMap,\n FlexibleOption,\n FlexibleOptionGroup,\n FlexibleOptionList,\n FlexibleOptionListProp,\n FullOption,\n FullOptionList,\n FullOptionMap,\n FullOptionRecord,\n GetOptionIdentifierType,\n Option,\n OptionGroup,\n Placeholder,\n ToFullOption,\n ValueOption,\n WithUnknownIndex,\n} from '../types';\nimport { isPojo } from './misc';\nimport { objectKeys } from './objectUtils';\n\nconst isOptionWithName = (opt: BaseOption): opt is Option =>\n isPojo(opt) && 'name' in opt && typeof opt.name === 'string';\nconst isOptionWithValue = (opt: BaseOption): opt is ValueOption =>\n isPojo(opt) && 'value' in opt && typeof opt.value === 'string';\n\n/**\n * Converts an {@link Option} or {@link ValueOption} (i.e., {@link BaseOption})\n * into a {@link FullOption}. Full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOption<Opt extends BaseOption>(\n opt: Opt | string,\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): ToFullOption<Opt> {\n const recipe: (o: Opt | string) => ToFullOption<Opt> = produce(draft => {\n const idObj: { name?: string; value?: string } = {};\n let needsUpdating = !!baseProperties;\n\n if (typeof draft === 'string') {\n return {\n ...baseProperties,\n name: draft,\n value: draft,\n label: labelMap?.[draft] ?? draft,\n } as Draft<Opt>;\n }\n\n if (isOptionWithName(draft) && !isOptionWithValue(draft)) {\n idObj.value = draft.name;\n needsUpdating = true;\n } else if (!isOptionWithName(draft) && isOptionWithValue(draft)) {\n idObj.name = draft.value;\n needsUpdating = true;\n }\n\n if (needsUpdating) {\n return Object.assign({}, baseProperties, draft, idObj);\n }\n });\n return recipe(opt);\n}\n\n/**\n * Converts an {@link OptionList} or {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionList<Opt extends BaseOption>(\n optList: unknown[],\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): FullOptionList<Opt> {\n if (!Array.isArray(optList)) {\n return [] as unknown as FullOptionList<Opt>;\n }\n\n const recipe: (ol: FlexibleOptionList<Opt>) => FullOptionList<Opt> = produce(draft => {\n if (isFlexibleOptionGroupArray(draft)) {\n for (const optGroup of draft) {\n for (const [idx, opt] of optGroup.options.entries())\n optGroup.options[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n } else {\n for (const [idx, opt] of (draft as Opt[]).entries())\n draft[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n });\n\n return recipe(optList as FlexibleOptionList<Opt>);\n}\n\n/**\n * Converts a {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionMap<OptMap extends BaseOptionMap>(\n optMap: OptMap,\n baseProperties?: Record<string, unknown>\n): OptMap extends BaseOptionMap<infer V, infer K> ? Partial<Record<K, ToFullOption<V>>> : never {\n type FullOptMapType =\n OptMap extends BaseOptionMap<infer VT, infer KT>\n ? Partial<Record<KT, ToFullOption<VT>>>\n : never;\n\n return Object.fromEntries(\n (Object.entries(optMap) as [string, FlexibleOption][]).map(([k, v]) => [\n k,\n toFullOption(v, baseProperties),\n ])\n ) as FullOptMapType;\n}\n\n/**\n * @deprecated Renamed to {@link uniqByIdentifier}.\n *\n * @group Option Lists\n */\nexport const uniqByName = <\n T extends { name: string; value?: string } | { name?: string; value: string },\n>(\n originalArray: T[]\n): T[] => uniqByIdentifier(originalArray);\n\n/**\n * Generates a new array of objects with duplicates removed based\n * on the identifying property (`value` or `name`)\n *\n * @group Option Lists\n */\nexport const uniqByIdentifier = <\n T extends RequireAtLeastOne<{ name: string; value: string }, 'name' | 'value'>,\n>(\n originalArray: T[]\n): T[] => {\n const names = new Set<string>();\n const newArray: T[] = [];\n for (const el of originalArray) {\n if (!names.has((el.value ?? el.name)!)) {\n names.add((el.value ?? el.name)!);\n newArray.push(el);\n }\n }\n return originalArray.length === newArray.length ? originalArray : newArray;\n};\n\n/**\n * Determines if an {@link OptionList} is an {@link OptionGroup} array.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isOptionGroupArray = (arr: any): arr is OptionGroup<BaseOption>[] =>\n Array.isArray(arr) &&\n arr.length > 0 &&\n isPojo(arr[0]) &&\n 'options' in arr[0] &&\n Array.isArray(arr[0].options);\n\n/**\n * Determines if an array is a flat array of {@link FlexibleOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFlexibleOptionArray = (arr: any): arr is FlexibleOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) || isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if an array is a flat array of {@link FullOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFullOptionArray = (arr: any): arr is FullOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) && isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link FlexibleOptionGroup} array.\n *\n * @group Option Lists\n */\nexport const isFlexibleOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is FlexibleOptionGroup[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFlexibleOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link OptionGroup} array of {@link FullOption}.\n *\n * @group Option Lists\n */\nexport const isFullOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is OptionGroup<FullOption>[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFullOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Gets the option from an {@link OptionList} with the given `name`. Handles\n * {@link Option} arrays as well as {@link OptionGroup} arrays.\n *\n * @group Option Lists\n */\nexport function getOption<OptType extends FullOption>(\n arr: FullOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends ValueOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends Option>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends BaseOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined {\n const options = isFlexibleOptionGroupArray(arr, { allowEmpty: true })\n ? arr.flatMap(og => og.options)\n : arr;\n return options.find(op => op.value === name || op.name === name) as OptType | undefined;\n}\n\n/**\n * Gets the first option from an {@link OptionList}.\n *\n * @group Option Lists\n */\nexport function getFirstOption<Opt extends FullOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends ValueOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends Option>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends BaseOption>(\n arr?: FlexibleOptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null {\n if (!Array.isArray(arr) || arr.length === 0) {\n return null;\n } else if (isFlexibleOptionGroupArray(arr, { allowEmpty: true })) {\n for (const og of arr) {\n if (og.options.length > 0) {\n return (og.options[0].value ?? og.options[0].name) as GetOptionIdentifierType<Opt>;\n }\n }\n // istanbul ignore next\n return null;\n }\n\n return (arr[0].value ?? arr[0].name) as GetOptionIdentifierType<Opt>;\n}\n\n/**\n * Flattens {@link FlexibleOptionGroup} arrays into {@link BaseOption} arrays.\n * If the array is already flat, it is returned as is.\n *\n * @group Option Lists\n */\nexport const toFlatOptionArray = <T extends FullOption, OL extends FullOptionList<T>>(arr: OL) =>\n uniqByIdentifier(isOptionGroupArray(arr) ? arr.flatMap(og => og.options) : arr) as T[];\n\n/**\n * Generates a new {@link OptionGroup} array with duplicates\n * removed based on the identifying property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptGroups = <T extends BaseOption>(\n originalArray: FlexibleOptionGroup<T>[]\n): OptionGroup<ToFullOption<T>>[] => {\n type K = T extends BaseOption<infer KT> ? KT : never;\n const labels = new Set<string>();\n const names = new Set<K>();\n const newArray: OptionGroup<ToFullOption<T>>[] = [];\n for (const el of originalArray) {\n if (!labels.has(el.label)) {\n labels.add(el.label);\n const optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[] = [];\n for (const opt of el.options) {\n if (!names.has((opt.value ?? opt.name) as K)) {\n names.add((opt.value ?? opt.name) as K);\n optionsForThisGroup.push(toFullOption(opt) as WithUnknownIndex<ToFullOption<T>>);\n }\n }\n newArray.push({ ...el, options: optionsForThisGroup });\n }\n }\n return newArray;\n};\n\n/**\n * Generates a new {@link Option} or {@link OptionGroup} array with duplicates\n * removed based on the identifier property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptList = <T extends BaseOption>(\n originalArray: FlexibleOptionList<T>\n): WithUnknownIndex<BaseOption & FullOption>[] | OptionGroup<ToFullOption<T>>[] => {\n if (isFlexibleOptionGroupArray(originalArray)) {\n return uniqOptGroups(originalArray) as OptionGroup<ToFullOption<T>>[];\n }\n return uniqByIdentifier((originalArray as BaseOption[]).map(o => toFullOption(o)));\n};\n\nexport interface PreparedOptionList<O extends FullOption> {\n defaultOption: FullOption;\n optionList: O[] | OptionGroup<O>[];\n optionsMap: Partial<FullOptionRecord<FullOption>>;\n}\n\nexport interface PrepareOptionListParams<O extends FullOption> {\n placeholder?: Placeholder;\n optionList?: FlexibleOptionListProp<O> | BaseOptionMap<O>;\n baseOption?: Record<string, unknown>;\n labelMap?: Record<string, string>;\n autoSelectOption?: boolean;\n}\n\nexport const prepareOptionList = <O extends FullOption>(\n props: PrepareOptionListParams<O>\n): PreparedOptionList<O> => {\n type OptionIdentifier = GetOptionIdentifierType<O>;\n\n // istanbul ignore next\n const {\n optionList: optionListPropOriginal,\n baseOption = {},\n labelMap = {},\n placeholder: {\n placeholderName = defaultPlaceholderName,\n placeholderLabel = defaultPlaceholderLabel,\n placeholderGroupLabel = defaultPlaceholderLabel,\n } = {},\n autoSelectOption = true,\n } = props;\n\n const defaultOption = {\n id: placeholderName,\n name: placeholderName,\n value: placeholderName,\n label: placeholderLabel,\n } as FullOption;\n\n const optionsProp = optionListPropOriginal ?? ([defaultOption] as FlexibleOptionList<O>);\n\n let optionList: O[] | OptionGroup<O>[] = [];\n const opts = (\n Array.isArray(optionsProp)\n ? toFullOptionList(optionsProp, baseOption, labelMap)\n : (objectKeys(toFullOptionMap(optionsProp, baseOption)) as unknown as OptionIdentifier[])\n .map<FullOption<OptionIdentifier>>(opt => ({\n ...optionsProp[opt]!,\n name: opt,\n value: opt,\n }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n ) as FullOptionList<O>;\n if (isFlexibleOptionGroupArray(opts)) {\n optionList = autoSelectOption\n ? (uniqOptGroups(opts) as FullOptionList<O>)\n : (uniqOptGroups([\n {\n label: placeholderGroupLabel,\n options: [defaultOption],\n },\n ...opts,\n ]) as FullOptionList<O>);\n } else {\n optionList = autoSelectOption\n ? (uniqByIdentifier(opts as O[]) as FullOptionList<O>)\n : (uniqByIdentifier([defaultOption, ...(opts as O[])]) as FullOptionList<O>);\n }\n\n let optionsMap: Partial<FullOptionRecord<FullOption>> = {};\n if (!Array.isArray(optionsProp)) {\n const op = toFullOptionMap(optionsProp, baseOption) as FullOptionMap<\n FullOption,\n OptionIdentifier\n >;\n optionsMap = autoSelectOption ? op : { ...op, [placeholderName]: defaultOption };\n } else {\n if (isFlexibleOptionGroupArray(optionList)) {\n for (const og of optionList) {\n for (const opt of og.options) {\n optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n toFullOption(opt, baseOption) as FullOption;\n }\n }\n } else {\n for (const opt of optionList) {\n optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n toFullOption(opt, baseOption) as FullOption;\n }\n }\n }\n\n return { defaultOption, optionList, optionsMap };\n};\n","import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import { numericQuantity } from 'numeric-quantity';\nimport type { ParseNumberMethod } from '../types';\n\n/**\n * Options object for {@link parseNumber}.\n */\nexport interface ParseNumberOptions {\n parseNumbers?: ParseNumberMethod;\n /**\n * Generates a `bigint` value if the string represents a valid integer\n * outside the safe boundaries of the `number` type.\n */\n bigIntOnOverflow?: boolean;\n}\n\n/**\n * Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is \"native\",\n * otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).\n * If that returns `NaN`, the string is returned unchanged. Numeric values are returned\n * as-is regardless of the `parseNumbers` option.\n */\nexport const parseNumber = (\n // oxlint-disable-next-line typescript/no-explicit-any\n val: any,\n { parseNumbers, bigIntOnOverflow }: ParseNumberOptions = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any => {\n if (!parseNumbers || typeof val === 'bigint' || typeof val === 'number') {\n return val;\n }\n\n if (parseNumbers === 'native') {\n return Number.parseFloat(val);\n }\n\n const valAsNum: number | bigint =\n // TODO: Should these options be configurable?\n numericQuantity(val, {\n allowTrailingInvalid: parseNumbers === 'enhanced',\n bigIntOnOverflow,\n romanNumerals: false,\n round: false,\n });\n\n return typeof valAsNum === 'bigint' || !Number.isNaN(valAsNum) ? valAsNum : val;\n};\n","/**\n * Recursively steps through a query object ({@link index!RuleGroupType RuleGroupType} or {@link index!RuleGroupTypeIC RuleGroupTypeIC}),\n * passing each {@link index!RuleType RuleType} object to a provided `ruleProcessor` function and returning a\n * new query object if there were any referential changes.\n *\n * @module transformQuery\n */\n\nimport { produce } from 'immer';\nimport type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\nconst remapProperties = (\n // oxlint-disable-next-line typescript/no-explicit-any\n obj: Record<string, any>,\n propertyMap: Record<string, string | false>,\n deleteRemappedProperties: boolean\n) =>\n produce(obj, draft => {\n for (const [k, v] of Object.entries(propertyMap)) {\n if (v === false) {\n delete draft[k];\n } else if (!!v && k !== v && k in draft) {\n draft[v] = draft[k];\n if (deleteRemappedProperties) {\n delete draft[k];\n }\n }\n }\n });\n\n/**\n * Options object for {@link index!transformQuery transformQuery}.\n */\nexport interface TransformQueryOptions<RG extends RuleGroupTypeAny = RuleGroupType> {\n /**\n * When a rule is encountered in the hierarchy, it will be replaced\n * with the result of this function.\n *\n * @defaultValue `r => r`\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n ruleProcessor?: (rule: RuleType) => any;\n /**\n * When a group is encountered in the hierarchy (including the root group, the\n * query itself), it will be replaced with the result of this function.\n *\n * @defaultValue `rg => rg`\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n ruleGroupProcessor?: (ruleGroup: RG) => Record<string, any>;\n /**\n * For each rule and group in the query, any properties matching a key\n * in this object will be renamed to the corresponding value. To retain both\n * the new _and_ the original properties, set `deleteRemappedProperties`\n * to `false`.\n *\n * If a key has a value of `false`, the corresponding property will be removed\n * without being copied to a new property name. (Warning: `{ rules: false }`\n * will prevent recursion and only return the processed root group.)\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', not: true, rules: [] },\n * { propertyMap: { combinator: 'AndOr', not: false } }\n * )\n * // Returns: { AndOr: 'and', rules: [] }\n * ```\n */\n propertyMap?: Record<string, string | false>;\n /**\n * Any combinator values (including independent combinators) will be translated\n * from the key in this object to the value.\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [] },\n * { combinatorMap: { and: '&&', or: '||' } }\n * )\n * // Returns: { combinator: '&&', rules: [] }\n * ```\n */\n combinatorMap?: Record<string, string>;\n /**\n * Any operator values will be translated from the key in this object to the value.\n *\n * @defaultValue `{}`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [{ field: 'name', operator: '=', value: 'Steve Vai' }] },\n * { operatorMap: { '=': 'is' } }\n * )\n * // Returns:\n * // {\n * // combinator: 'and',\n * // rules: [{ field: 'name', operator: 'is', value: 'Steve Vai' }]\n * // }\n * ```\n */\n operatorMap?: Record<string, string>;\n /**\n * Prevents the `path` property (see {@link index!Path Path}) from being added to each\n * rule and group in the hierarchy.\n *\n * @defaultValue `false`\n */\n omitPath?: boolean;\n /**\n * Original properties remapped according to the `propertyMap` option will be removed.\n *\n * @defaultValue `true`\n *\n * @example\n * ```\n * transformQuery(\n * { combinator: 'and', rules: [] },\n * { propertyMap: { combinator: 'AndOr' }, deleteRemappedProperties: false }\n * )\n * // Returns: { combinator: 'and', AndOr: 'and', rules: [] }\n * ```\n */\n deleteRemappedProperties?: boolean;\n}\n\n/**\n * Recursively process a query heirarchy using this versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n query: RuleGroupType,\n options?: TransformQueryOptions\n // oxlint-disable-next-line typescript/no-explicit-any\n): any;\n/**\n * Recursively process a query heirarchy with independent combinators using this\n * versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n query: RuleGroupTypeIC,\n options?: TransformQueryOptions<RuleGroupTypeIC>\n // oxlint-disable-next-line typescript/no-explicit-any\n): any;\nexport function transformQuery<RG extends RuleGroupTypeAny>(\n query: RG,\n options: TransformQueryOptions<RG> = {}\n) {\n const {\n ruleProcessor = r => r,\n ruleGroupProcessor = rg => rg,\n propertyMap = {},\n combinatorMap = {},\n operatorMap = {},\n omitPath = false,\n deleteRemappedProperties = true,\n } = options;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processGroup = (rg: RuleGroupTypeAny): any => ({\n ...ruleGroupProcessor(\n remapProperties(\n {\n ...rg,\n ...(isRuleGroupType(rg)\n ? { combinator: combinatorMap[rg.combinator] ?? rg.combinator }\n : {}),\n },\n propertyMap,\n deleteRemappedProperties\n ) as RG\n ),\n ...(propertyMap['rules'] === false\n ? null\n : {\n // oxlint-disable-next-line typescript/no-explicit-any\n [propertyMap['rules'] ?? 'rules']: rg.rules.map((r: any, idx) => {\n const pathObject = omitPath ? null : { path: [...rg.path!, idx] };\n if (typeof r === 'string') {\n // independent combinators\n return combinatorMap[r] ?? r;\n } else if (isRuleGroup(r)) {\n // sub-groups\n return processGroup({ ...r, ...pathObject });\n }\n // rules\n return ruleProcessor(\n remapProperties(\n {\n ...r,\n ...pathObject,\n ...('operator' in r ? { operator: operatorMap[r.operator] ?? r.operator } : {}),\n },\n propertyMap,\n deleteRemappedProperties\n ) as RuleType\n );\n }),\n }),\n });\n\n return processGroup({ ...query, ...(omitPath ? null : { path: [] }) });\n}\n","import type { RuleGroupTypeAny, RuleType, RuleValidator, ValidationResult } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is useful as a validation result.\n */\nexport const isValidationResult = (vr?: ValidationResult): vr is ValidationResult =>\n isPojo(vr) && typeof vr.valid === 'boolean';\n\n/**\n * Determines if a rule or group is valid based on a validation result (if defined)\n * or a validator function. Returns `true` if neither are defined and the `muted`\n * property is not `true`.\n */\nexport const isRuleOrGroupValid = (\n rg: RuleType | RuleGroupTypeAny,\n validationResult?: boolean | ValidationResult,\n validator?: RuleValidator\n): boolean => {\n if (rg.muted) {\n return false;\n }\n if (typeof validationResult === 'boolean') {\n return validationResult;\n }\n if (isValidationResult(validationResult)) {\n return validationResult.valid;\n }\n if (typeof validator === 'function' && !isRuleGroup(rg)) {\n const vr = validator(rg);\n if (typeof vr === 'boolean') {\n return vr;\n }\n // istanbul ignore else\n if (isValidationResult(vr)) {\n return vr.valid;\n }\n }\n return true;\n};\n","import type { InputType, ParseNumberMethod, ParseNumbersPropConfig } from '../types';\n\nexport const getParseNumberMethod = ({\n parseNumbers,\n inputType,\n}: {\n parseNumbers?: ParseNumbersPropConfig;\n inputType?: InputType | null;\n}): ParseNumberMethod => {\n if (typeof parseNumbers === 'string') {\n const [method, level] = parseNumbers.split('-') as\n | [ParseNumberMethod, 'limited']\n | [ParseNumberMethod];\n if (level === 'limited') {\n return inputType === 'number' ? method : false;\n }\n\n return method;\n }\n\n return parseNumbers ? 'strict' : false;\n};\n","import type { SetRequired } from 'type-fest';\nimport type {\n ConstituentWordOrder,\n DefaultCombinatorName,\n FormatQueryOptions,\n FullField,\n GroupVariantCondition,\n MatchMode,\n NLTranslationKey,\n NLTranslations,\n OptionList,\n RuleGroupTypeAny,\n RuleType,\n ValueProcessorByRule,\n ValueProcessorLegacy,\n ValueProcessorOptions,\n} from '../../types';\nimport { joinWith, splitBy, toArray } from '../arrayUtils';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isPojo, lc, numericRegex } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { parseNumber } from '../parseNumber';\n\n/**\n * Maps a {@link DefaultOperatorName} to a SQL operator.\n *\n * @group Export\n */\nexport const mapSQLOperator = (rqbOperator: string): string => {\n switch (lc(rqbOperator)) {\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 rqbOperator;\n }\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a MongoDB operator.\n *\n * @group Export\n */\nexport const mongoOperators = {\n '=': '$eq',\n '!=': '$ne',\n '<': '$lt',\n '<=': '$lte',\n '>': '$gt',\n '>=': '$gte',\n in: '$in',\n notin: '$nin',\n notIn: '$nin', // only here for backwards compatibility\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a Prisma ORM operator.\n *\n * @group Export\n */\nexport const prismaOperators = {\n '=': 'equals',\n '!=': 'not',\n '<': 'lt',\n '<=': 'lte',\n '>': 'gt',\n '>=': 'gte',\n in: 'in',\n notin: 'notIn',\n};\n\n/**\n * Maps a {@link DefaultCombinatorName} to a CEL combinator.\n *\n * @group Export\n */\nexport const celCombinatorMap: {\n and: '&&';\n or: '||';\n} = {\n and: '&&',\n or: '||',\n} satisfies Record<DefaultCombinatorName, '&&' | '||'>;\n\n/**\n * Register these operators with `jsonLogic` before applying the result\n * of `formatQuery(query, 'jsonlogic')`.\n *\n * @example\n * ```\n * for (const [op, func] of Object.entries(jsonLogicAdditionalOperators)) {\n * jsonLogic.add_operation(op, func);\n * }\n * jsonLogic.apply({ \"startsWith\": [{ \"var\": \"firstName\" }, \"Stev\"] }, data);\n * ```\n *\n * @group Export\n */\nexport const jsonLogicAdditionalOperators: Record<\n 'startsWith' | 'endsWith',\n (a: string, b: string) => boolean\n> = {\n startsWith: (a: string, b: string) => typeof a === 'string' && a.startsWith(b),\n endsWith: (a: string, b: string) => typeof a === 'string' && a.endsWith(b),\n};\n\n/**\n * Converts all `string`-type `value` properties of a query object into `number` where appropriate.\n *\n * Used by {@link formatQuery} for the `json*` formats when `parseNumbers` is `true`.\n *\n * @group Export\n */\nexport const numerifyValues = (\n rg: RuleGroupTypeAny,\n options: SetRequired<FormatQueryOptions, 'fields'>\n): RuleGroupTypeAny => ({\n ...rg,\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\n if (isRuleGroup(r)) {\n return numerifyValues(r, options);\n }\n\n const fieldData = getOption(options.fields as OptionList<FullField>, r.field);\n const parseNumbers = getParseNumberMethod({\n parseNumbers: options.parseNumbers,\n inputType: fieldData?.inputType,\n });\n\n if (Array.isArray(r.value)) {\n return { ...r, value: r.value.map(v => parseNumber(v, { parseNumbers })) };\n }\n\n const valAsArray = toArray(r.value, { retainEmptyStrings: true }).map(v =>\n parseNumber(v, { parseNumbers })\n );\n if (valAsArray.every(v => typeof v === 'number')) {\n // istanbul ignore else\n if (valAsArray.length > 1) {\n return { ...r, value: valAsArray };\n } else if (valAsArray.length === 1) {\n return { ...r, value: valAsArray[0] };\n }\n }\n\n return r;\n }),\n});\n\n/**\n * Determines whether a value is _anything_ except an empty `string` or `NaN`.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isValidValue = (value: any): boolean =>\n (typeof value === 'string' && value.length > 0) ||\n (typeof value === 'number' && !Number.isNaN(value)) ||\n (typeof value !== 'string' && typeof value !== 'number');\n\n/**\n * Determines whether {@link formatQuery} should render the given value as a number.\n * As long as `parseNumbers` is `true`, `number` and `bigint` values will return `true` and\n * `string` values will return `true` if they test positive against {@link numericRegex}.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const shouldRenderAsNumber = (value: any, parseNumbers?: boolean): boolean =>\n !!parseNumbers &&\n (typeof value === 'number' ||\n typeof value === 'bigint' ||\n (typeof value === 'string' && numericRegex.test(value)));\n\n/**\n * Used by {@link formatQuery} to determine whether the given value processor is a\n * \"legacy\" value processor by counting the number of arguments. Legacy value\n * processors take 3 arguments (not counting any arguments with default values), while\n * rule-based value processors take no more than 2 arguments.\n *\n * @group Export\n */\nexport const isValueProcessorLegacy = (\n valueProcessor: ValueProcessorLegacy | ValueProcessorByRule\n): valueProcessor is ValueProcessorLegacy => valueProcessor.length >= 3;\n\n/**\n * Converts the `quoteFieldNamesWith` option into an array of two strings.\n * If the option is a string, the array elements are both that string.\n *\n * @default\n * ['', '']\n *\n * @group Export\n */\nexport const getQuoteFieldNamesWithArray = (\n // istanbul ignore next\n quoteFieldNamesWith: null | string | [string, string] = ['', '']\n): [string, string] =>\n Array.isArray(quoteFieldNamesWith)\n ? quoteFieldNamesWith\n : typeof quoteFieldNamesWith === 'string'\n ? [quoteFieldNamesWith, quoteFieldNamesWith]\n : (quoteFieldNamesWith ?? ['', '']);\n\n/**\n * Given a field name and relevant {@link ValueProcessorOptions}, returns the field name\n * wrapped in the configured quote character(s).\n *\n * @group Export\n */\nexport const getQuotedFieldName = (\n fieldName: string,\n { quoteFieldNamesWith, fieldIdentifierSeparator }: ValueProcessorOptions\n): string => {\n const [qPre, qPost] = getQuoteFieldNamesWithArray(quoteFieldNamesWith);\n return typeof fieldIdentifierSeparator === 'string' && fieldIdentifierSeparator.length > 0\n ? joinWith(\n splitBy(fieldName, fieldIdentifierSeparator).map(part => `${qPre}${part}${qPost}`),\n fieldIdentifierSeparator\n )\n : `${qPre}${fieldName}${qPost}`;\n};\n\nconst defaultWordOrder = ['S', 'V', 'O'];\n\n/**\n * Given a [Constituent word order](https://en.wikipedia.org/wiki/Word_order#Constituent_word_orders)\n * like \"svo\" or \"sov\", returns a permutation of `[\"S\", \"V\", \"O\"]` based on the first occurrence of\n * each letter in the input string (case insensitive). This widens the valid input from abbreviations\n * like \"svo\" to more expressive strings like \"subject-verb-object\" or \"sub ver obj\". Any missing\n * letters are appended in the default order \"SVO\" (e.g., \"object\" would yield `[\"O\", \"S\", \"V\"]`).\n *\n * @group Export\n */\nexport const normalizeConstituentWordOrder = (input: string): ConstituentWordOrder => {\n const result: string[] = [];\n const letterSet = new Set(defaultWordOrder);\n\n for (const char of input.toUpperCase()) {\n if (letterSet.has(char)) {\n result.push(char);\n letterSet.delete(char);\n if (letterSet.size === 0) break;\n }\n }\n\n // Add any missing letters in default order\n for (const letter of defaultWordOrder) {\n if (letterSet.has(letter)) {\n result.push(letter);\n }\n }\n\n return result as ConstituentWordOrder;\n};\n\n/**\n * Default translations used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\n// The ones commented below are unnecessary for the default implementation,\n// but they can be overridden for customized implementations.\nexport const defaultNLTranslations: NLTranslations = {\n // and: 'and',\n // or: 'or',\n // true: 'true',\n // false: 'false',\n groupPrefix: '',\n // groupPrefix_not: '',\n groupPrefix_not_xor: 'either zero or more than one of',\n groupPrefix_xor: 'exactly one of',\n groupSuffix: 'is true',\n groupSuffix_not: 'is not true',\n // groupSuffix_not_xor: 'is true',\n // groupSuffix_xor: 'is true',\n};\n\n/**\n * Note: This function assumes `conditions.length > 0`\n */\nconst translationMatchFilter = (\n key: NLTranslationKey,\n keyToTest: string,\n conditions: GroupVariantCondition[]\n) =>\n // The translation matches the base key\n keyToTest.startsWith(key) &&\n // The translation specifies all conditions\n conditions.every(\n c =>\n // This translation specifies _this_ condition\n keyToTest.includes(`_${c}`) &&\n // This translation specifies the same _total number_ of conditions\n keyToTest.match(/_/g)?.length === conditions.length\n );\n\n/**\n * Used by {@link formatQuery} to get a translation based on certain conditions\n * for the \"natural_language\" format.\n *\n * @group Export\n */\nexport const getNLTranslataion = (\n key: NLTranslationKey,\n translations: NLTranslations,\n conditions: GroupVariantCondition[] = []\n): string =>\n conditions.length === 0\n ? (translations[key] ?? defaultNLTranslations[key] ?? /* istanbul ignore next */ '')\n : (Object.entries(translations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n Object.entries(defaultNLTranslations).find(([keyToTest]) =>\n translationMatchFilter(key, keyToTest, conditions)\n )?.[1] ??\n defaultNLTranslations[key] ??\n /* istanbul ignore next */ '');\n\ntype ProcessedMatchMode =\n | { mode: 'all'; threshold?: number | null | undefined }\n | { mode: 'none'; threshold?: number | null | undefined }\n | { mode: 'some'; threshold?: number | null | undefined }\n | { mode: 'atleast'; threshold: number }\n | { mode: 'atmost'; threshold: number }\n | { mode: 'exactly'; threshold: number };\n\nexport const processMatchMode = (rule: RuleType): void | false | ProcessedMatchMode => {\n const { mode, threshold } = rule.match ?? {};\n\n if (mode) {\n if (!isRuleGroup(rule.value)) return false;\n\n const matchModeLC = lc(mode) as Lowercase<MatchMode>;\n\n const matchModeCoerced =\n matchModeLC === 'atleast' && threshold === 1\n ? 'some'\n : matchModeLC === 'atmost' && threshold === 0\n ? 'none'\n : matchModeLC;\n\n if (\n (matchModeCoerced === 'atleast' ||\n matchModeCoerced === 'atmost' ||\n matchModeCoerced === 'exactly') &&\n (typeof threshold !== 'number' || threshold < 0)\n ) {\n return false;\n }\n\n return { mode: matchModeCoerced, threshold: threshold! };\n }\n};\n\n/**\n * \"Replacer\" method for JSON.stringify's second argument. Converts `bigint` values to\n * objects with a `$bigint` property having a value of a string representation of\n * the actual `bigint`-type value.\n *\n * Inverse of {@link bigIntJsonParseReviver}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonStringifyReplacer = (_key: string, value: unknown): unknown =>\n typeof value === 'bigint' ? { $bigint: value.toString() } : value;\n\n/**\n * \"Reviver\" method for JSON.parse's second argument. Converts objects having a single\n * `$bigint: string` property to an actual `bigint` value.\n *\n * Inverse of {@link bigIntJsonStringifyReplacer}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonParseReviver = (_key: string, value: unknown): unknown =>\n isPojo(value) && Object.keys(value).length === 1 && typeof value.$bigint === 'string'\n ? BigInt(value.$bigint)\n : value;\n","import type { DefaultCombinatorName, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { celCombinatorMap } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorCEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = celCombinatorMap[rule as DefaultCombinatorName];\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(\n isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator as DefaultCombinatorName]} ` : ' '\n );\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeDoubleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorCEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const celQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: `${arrayElementAlias}${r.field ? `.${r.field}` : ''}` }),\n });\n const nestedArrayFilter = defaultRuleGroupProcessorCEL(\n celQuery,\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'none':\n case 'some':\n return `${mode === 'none' ? '!' : ''}${field}.exists(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const totalCount = `double(${field}.size())`;\n const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;\n\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n }`;\n\n case 'contains':\n case 'doesnotcontain': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.contains(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.startsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n return `${negate}${field}.endsWith(${\n valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n })`;\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const [prefix, suffix] = shouldNegate(operatorTL) ? ['!(', ')'] : ['', ''];\n const valueAsArray = toArray(value);\n return `${prefix}${field} in [${valueAsArray\n .map(val =>\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n )\n .join(', ')}]${suffix}`;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"`\n : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} && ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const mongoDbFallback = { $and: [{ $expr: true }] } as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? mongoDbFallback : false;\n }\n\n const combinator = `$${lc(rg.combinator)}`;\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return false;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : mongoDbFallback;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorMongoDBQuery } from './defaultRuleGroupProcessorMongoDBQuery';\nimport { isValidValue, mongoOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers = false) =>\n shouldRenderAsNumber(value, parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: 'strict' }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDBQuery: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder, context } = options;\n const valueIsField = valueSource === 'field';\n\n const { avoidFieldsAsKeys } = (context ?? {}) as { avoidFieldsAsKeys?: boolean };\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = { $size: { $ifNull: [`$${field}`, []] } };\n const subQueryNoAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `${field}.${r.field}` : field }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: false },\n }\n );\n const subQueryWithAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$item.${r.field}` : '$item' }),\n }),\n {\n ...(options as FormatQueryFinalOptions),\n // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n ruleProcessor: defaultRuleProcessorMongoDBQuery,\n context: { ...options.context, avoidFieldsAsKeys: true },\n }\n );\n\n const filteredCount = {\n $size: {\n $ifNull: [\n { $filter: { input: `$${field}`, as: 'item', cond: { $and: [subQueryWithAggCtx] } } },\n [],\n ],\n },\n };\n\n switch (mode) {\n case 'all':\n return { $expr: { $eq: [filteredCount, totalCount] } };\n\n case 'none':\n return { $nor: [subQueryNoAggCtx] };\n\n case 'some':\n return subQueryNoAggCtx;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op =\n mode === 'atleast'\n ? mongoOperators['>=']\n : mode === 'atmost'\n ? mongoOperators['<=']\n : mongoOperators['='];\n\n if (threshold > 0 && threshold < 1) {\n return { $expr: { [op]: [filteredCount, { $multiply: [totalCount, threshold] }] } };\n }\n return { $expr: { [op]: [filteredCount, threshold] } };\n }\n }\n }\n\n if (operator === '=' && !valueIsField) {\n return avoidFieldsAsKeys\n ? { $eq: [`$${field}`, processNumber(value, value, parseNumbers)] }\n : { [field]: processNumber(value, value, parseNumbers) };\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=': {\n const mongoOperator = mongoOperators[operatorLC];\n return valueIsField\n ? { [mongoOperator]: [`$${field}`, `$${value}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [\n { $ne: [`$${field}`, null] },\n { [mongoOperator]: [`$${field}`, processNumber(value, value, parseNumbers)] },\n ],\n }\n : { [field]: { [mongoOperator]: processNumber(value, value, parseNumbers) } };\n }\n\n case 'contains':\n return valueIsField\n ? { $where: `this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: value } }\n : { [field]: { $regex: value } };\n\n case 'beginswith':\n return valueIsField\n ? { $where: `this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `^${value}` } }\n : { [field]: { $regex: `^${value}` } };\n\n case 'endswith':\n return valueIsField\n ? { $where: `this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $regexMatch: { input: `$${field}`, regex: `${value}$` } }\n : { [field]: { $regex: `${value}$` } };\n\n case 'doesnotcontain':\n return valueIsField\n ? { $where: `!this.${field}.includes(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: value } } }\n : { [field]: { $not: { $regex: value } } };\n\n case 'doesnotbeginwith':\n return valueIsField\n ? { $where: `!this.${field}.startsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `^${value}` } } }\n : { [field]: { $not: { $regex: `^${value}` } } };\n\n case 'doesnotendwith':\n return valueIsField\n ? { $where: `!this.${field}.endsWith(this.${value})` }\n : avoidFieldsAsKeys\n ? { $not: { $regexMatch: { input: `$${field}`, regex: `${value}$` } } }\n : { [field]: { $not: { $regex: `${value}$` } } };\n\n case 'null':\n return avoidFieldsAsKeys ? { $eq: [`$${field}`, null] } : { [field]: null };\n\n case 'notnull':\n return avoidFieldsAsKeys ? { $ne: [`$${field}`, null] } : { [field]: { $ne: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return valueIsField\n ? {\n $where: `${operatorLC === 'notin' ? '!' : ''}[${valueAsArray\n .map(val => `this.${val}`)\n .join(',')}].includes(this.${field})`,\n }\n : avoidFieldsAsKeys\n ? operatorLC === 'notin'\n ? {\n $not: {\n [mongoOperators.in]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n },\n }\n : {\n [mongoOperators[operatorLC]]: [\n `$${field}`,\n valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n ],\n }\n : {\n [field]: {\n [mongoOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n const firstNum = processNumber(first, Number.NaN, true);\n const secondNum = processNumber(second, Number.NaN, true);\n let firstValue = valueIsField ? first : Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = valueIsField ? second : Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n if (operatorLC === 'between') {\n return valueIsField\n ? { $gte: [`$${field}`, `$${firstValue}`], $lte: [`$${field}`, `$${secondValue}`] }\n : avoidFieldsAsKeys\n ? {\n $and: [{ $gte: [`$${field}`, firstValue] }, { $lte: [`$${field}`, secondValue] }],\n }\n : { [field]: { $gte: firstValue, $lte: secondValue } };\n } else {\n return valueIsField\n ? {\n $or: [\n { $lt: [`$${field}`, `$${firstValue}`] },\n { $gt: [`$${field}`, `$${secondValue}`] },\n ],\n }\n : avoidFieldsAsKeys\n ? {\n $or: [{ $lt: [`$${field}`, firstValue] }, { $gt: [`$${field}`, secondValue] }],\n }\n : { $or: [{ [field]: { $lt: firstValue } }, { [field]: { $gt: secondValue } }] };\n }\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { RuleProcessor } from '../../types';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDB: RuleProcessor = (rule, options) => {\n const queryObj = defaultRuleProcessorMongoDBQuery(rule, options);\n return queryObj ? JSON.stringify(queryObj) : '';\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\nconst wrapInNegation = (clause: string, negate: boolean) => (negate ? `!(${clause})` : clause);\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeSingleQuotes = (v: any, escapeQuotes?: boolean) =>\n typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\\\'`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSpEL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n const valueIsField = valueSource === 'field';\n const operatorTL = lc(operator === '=' ? '==' : operator);\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorSpEL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field || '#this' }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n const totalCount = `${field}.size()`;\n const filteredCount = `${field}.?[${nestedArrayFilter}].size()`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} == ${totalCount}`;\n\n case 'none':\n return `${filteredCount} == 0`;\n\n case 'some':\n return `${filteredCount} >= 1`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n switch (operatorTL) {\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '>':\n case '>=':\n return `${field} ${operatorTL} ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return wrapInNegation(\n `${field} matches ${\n valueIsField || useBareValue\n ? trimIfString(value)\n : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n }`,\n shouldNegate(operatorTL)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const valueTL = valueIsField\n ? `'^'.concat(${trimIfString(value)})`\n : `'${\n (typeof value === 'string' && !value.startsWith('^')) || useBareValue ? '^' : ''\n }${escapeSingleQuotes(value, escapeQuotes)}'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const valueTL = valueIsField\n ? `${trimIfString(value)}.concat('$')`\n : `'${escapeSingleQuotes(value, escapeQuotes)}${\n (typeof value === 'string' && !value.endsWith('$')) || useBareValue ? '$' : ''\n }'`;\n return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n }\n\n case 'null':\n return `${field} == null`;\n\n case 'notnull':\n return `${field} != null`;\n\n case 'in':\n case 'notin': {\n const negate = shouldNegate(operatorTL) ? '!' : '';\n const valueAsArray = toArray(value);\n return valueAsArray.length > 0\n ? `${negate}(${valueAsArray\n .map(\n val =>\n `${field} == ${\n valueIsField || shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : `'${escapeSingleQuotes(val, escapeQuotes)}'`\n }`\n )\n .join(' or ')})`\n : '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n !nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility in SpEL format, between operators should parse numbers\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum)\n ? valueIsField\n ? `${first}`\n : `'${escapeSingleQuotes(first, escapeQuotes)}'`\n : firstNum;\n let secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : `'${escapeSingleQuotes(second, escapeQuotes)}'`\n : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n return operatorTL === 'between'\n ? `(${field} >= ${firstValue} and ${field} <= ${secondValue})`\n : `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n } else {\n return '';\n }\n }\n }\n\n return '';\n};\n","import type { ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeStringValueQuotes = (v: any, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorByRule: ValueProcessorByRule = (\n { operator, value, valueSource },\n // istanbul ignore next - defaultRuleProcessorSQL always provides options\n {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith,\n quoteValuesWith,\n concatOperator = '||',\n fieldIdentifierSeparator,\n wrapValueWith = ['', ''],\n translations,\n } = {}\n) => {\n const valueIsField = valueSource === 'field';\n const operatorLowerCase = lc(operator);\n const quoteChar = quoteValuesWith || \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) =>\n `${wrapValueWith[0]}${quoteChar}${v}${quoteChar}${wrapValueWith[1]}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n const concat = (...values: string[]) =>\n concatOperator.toUpperCase() === 'CONCAT'\n ? `CONCAT(${values.join(', ')})`\n : values.join(` ${concatOperator} `);\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n return `(${valueAsArray\n .map(v =>\n valueIsField\n ? wrapFieldName(v)\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n )\n .join(', ')})`;\n }\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n const secondValue = Number.isNaN(secondNum)\n ? valueIsField\n ? `${second}`\n : second\n : secondNum;\n\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return (\n (\n valueIsField\n ? valsOneAndTwoOnly.map(v => wrapFieldName(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly.map(v => wrapAndEscape(v))\n )\n // Note: `translations` should not be used for SQL.\n // This is only here to support the \"natural_language\" format.\n .join(` ${translations?.and ?? 'and'} `)\n );\n }\n\n case 'contains':\n case 'doesnotcontain':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value), quoteValue('%'))\n : quoteValue(`%${escapeValue(value)}%`);\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return valueIsField\n ? concat(wrapFieldName(value), quoteValue('%'))\n : quoteValue(`${escapeValue(value)}%`);\n\n case 'endswith':\n case 'doesnotendwith':\n return valueIsField\n ? concat(quoteValue('%'), wrapFieldName(value))\n : quoteValue(`%${escapeValue(value)}`);\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n return valueIsField\n ? wrapFieldName(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? `${trimIfString(value)}`\n : `${wrapAndEscape(value)}`;\n};\n","import type { Column, Operators, SQL, SQLWrapper } from 'drizzle-orm';\nimport type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"drizzle\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorDrizzle: RuleProcessor = (rule, _options): SQL | undefined => {\n const opts = _options ?? /* istanbul ignore next */ {};\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder, context = {} } = opts;\n const { columns, drizzleOperators, useRawFields } = context as {\n columns: Record<string, Column>;\n drizzleOperators: Operators;\n useRawFields?: boolean;\n };\n\n if (!columns || !drizzleOperators) return;\n\n const {\n between,\n eq,\n gt,\n gte,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n notBetween,\n notInArray,\n notLike,\n sql,\n } = drizzleOperators;\n\n const { field, operator, value, valueSource } = rule;\n // TODO: Improve field validation\n const column =\n useRawFields && /[a-z][a-z0-9]*/i.test(field)\n ? (sql.raw(field) as Exclude<SQLWrapper, SQL.Aliased | Column>)\n : columns[field];\n const operatorLC = lc(operator);\n\n const valueIsField = valueSource === 'field';\n const asFieldOrValue = (v: string) => (valueIsField ? columns[v] : v);\n\n if (!column) return;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts.preset !== 'postgresql') return;\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const sqlQuery = transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n });\n\n const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {\n ...(opts as FormatQueryFinalOptions),\n context: { ...opts.context, useRawFields: true },\n });\n\n switch (mode) {\n case 'all':\n return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;\n\n case 'none':\n return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'some':\n return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return threshold > 0 && threshold < 1\n ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`\n : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;\n }\n }\n }\n\n switch (operatorLC) {\n case '=':\n return eq(column, asFieldOrValue(value));\n case '!=':\n return ne(column, asFieldOrValue(value));\n case '>':\n return gt(column, asFieldOrValue(value));\n case '<':\n return lt(column, asFieldOrValue(value));\n case '>=':\n return gte(column, asFieldOrValue(value));\n case '<=':\n return lte(column, asFieldOrValue(value));\n case 'beginswith':\n case 'doesnotbeginwith':\n return (operatorLC === 'doesnotbeginwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`\n );\n case 'contains':\n case 'doesnotcontain':\n return (operatorLC === 'doesnotcontain' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`\n );\n case 'endswith':\n case 'doesnotendwith':\n return (operatorLC === 'doesnotendwith' ? notLike : like)(\n column as SQL,\n valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`\n );\n case 'null':\n return isNull(column);\n case 'notnull':\n return isNotNull(column);\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => asFieldOrValue(v));\n return operatorLC === 'notin'\n ? notInArray(column, valueAsArray)\n : inArray(column, valueAsArray);\n }\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n } else {\n // istanbul ignore else\n if (valueIsField) {\n first = asFieldOrValue(first);\n second = asFieldOrValue(second);\n }\n }\n return operatorLC === 'notbetween'\n ? notBetween(column, first, second)\n : between(column, first, second);\n }\n return;\n }\n default:\n return;\n }\n};\n","import type { Column, Operators, SQL, Table } from 'drizzle-orm';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\n\n/**\n * Default rule group processor used by {@link formatQuery} for the \"drizzle\" format. The returned\n * function can be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @example\n * const where = formatQuery(query, 'drizzle');\n * const results = db.query.users.findMany({ where });\n *\n * @returns Function that takes a Drizzle table config and an object of Drizzle operators.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n> =\n (ruleGroup, options, _meta) =>\n (columns: Table | Record<string, Column>, drizzleOperators: Operators) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n validateRule,\n validationMap,\n } = options;\n\n if (!columns || !drizzleOperators) return;\n\n const { and, not, or } = drizzleOperators;\n\n const ruleProcessor = defaultRuleProcessorDrizzle;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): SQL | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n context: { ...options.context, columns, drizzleOperators },\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return;\n }\n\n const ruleGroupSQL: SQL | undefined =\n rg.combinator === 'or' ? or(...processedRules)! : and(...processedRules)!;\n\n return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n };\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const processRuleGroup = (rg: RuleGroupType): Record<string, any> | false => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n return {\n bool: rg.not\n ? {\n must_not: /^or$/i.test(rg.combinator)\n ? { bool: { should: processedRules } }\n : processedRules,\n }\n : { [/^or$/i.test(rg.combinator) ? 'should' : 'must']: processedRules },\n };\n };\n\n const processedRuleGroup = processRuleGroup(convertFromIC(ruleGroup));\n return processedRuleGroup === false ? {} : processedRuleGroup;\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule);\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const fieldData = getOption(fields, rule.field);\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '$not' : ''}(`, ')'] : ['', ''];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n DefaultCombinatorName,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupType,\n} from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic> = (\n ruleGroup,\n options\n) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const query = convertFromIC(ruleGroup);\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): RQBJsonLogic => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return false;\n }\n\n const processedRules = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return false;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (processedRules.length === 0) {\n return false;\n }\n\n const jsonRuleGroup: RQBJsonLogic = { [rg.combinator]: processedRules } as {\n [k in DefaultCombinatorName]: [RQBJsonLogic, RQBJsonLogic, ...RQBJsonLogic[]];\n };\n\n return rg.not ? { '!': jsonRuleGroup } : jsonRuleGroup;\n };\n\n return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const rules: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n return processRuleGroup(rule);\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n fieldData,\n });\n })\n .filter(Boolean);\n\n const expression = rules.join('');\n\n const [notPrefix, notSuffix] = rg.not ? ['(!', ')'] : ['', ''];\n const [prefix, suffix] =\n rules.length > 1\n ? [`${notPrefix}(${rg.combinator === 'or' ? '|' : '&'}`, `)${notSuffix}`]\n : [notPrefix, notSuffix];\n\n return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\nconst isBracketed = (str: string) => str.startsWith('{') && str.endsWith('}');\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string> = (\n ruleGroup,\n options,\n meta\n) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? fallbackExpression : '';\n }\n\n const combinator = `\"$${lc(rg.combinator)}\"`;\n let hasChildRules = false;\n\n const expressions: string[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n // Don't wrap in curly braces if the result already is.\n return isBracketed(processedRuleGroup) ? processedRuleGroup : `{${processedRuleGroup}}`;\n }\n return '';\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n },\n meta\n );\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : `${combinator}:[${expressions.join(',')}]`\n : fallbackExpression;\n };\n\n const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);\n return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;\n};\n","import type { NLTranslationKey, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { getNLTranslataion } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorNL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n translations,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const rg2 =\n isRuleGroupTypeIC(rg) && rg.rules.some(r => typeof r === 'string' && lc(r) === 'xor')\n ? convertFromIC(rg)\n : rg;\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg2.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = `, ${translations[rule as NLTranslationKey] ?? rule} `;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(\n rule,\n rg2.rules.length === 1 &&\n !(rg2.not || /^xor$/i.test(rg2.combinator ?? /* istanbul ignore next */ ''))\n );\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n const isXOR = lc(rg2.combinator ?? '') === 'xor';\n const combinator = isXOR ? rg2.combinator!.slice(1) : rg2.combinator;\n const mustWrap = rg2.not || !outermostOrLonelyInGroup || (isXOR && processedRules.length > 1);\n\n const [prefixTL, suffixTL] = (['groupPrefix', 'groupSuffix'] as const).map(key =>\n rg2.not\n ? isXOR\n ? getNLTranslataion(key, translations, ['not', 'xor'])\n : getNLTranslataion(key, translations, ['not'])\n : isXOR\n ? getNLTranslataion(key, translations, ['xor'])\n : getNLTranslataion(key, translations)\n );\n\n const prefix = mustWrap ? `${prefixTL} (`.trim() : '';\n const suffix = mustWrap ? `) ${suffixTL}`.trim() : '';\n\n return `${prefix}${processedRules.join(\n isRuleGroupType(rg2) ? `, ${translations[combinator as NLTranslationKey] ?? combinator} ` : ''\n )}${suffix}`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type {\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleType,\n} from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { isPojo } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n ParameterizedSQL | ParameterizedNamedSQL\n> = (ruleGroup, options) => {\n const {\n format,\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n const fieldParams: Map<string, Set<string>> = new Map();\n\n const getNextNamedParam = (field: string) => {\n if (!fieldParams.has(field)) {\n fieldParams.set(field, new Set());\n }\n const nextNamedParam = `${field}_${fieldParams.get(field)!.size + 1}`;\n fieldParams.get(field)!.add(nextNamedParam);\n return nextNamedParam;\n };\n\n const processRule = (rule: RuleType) => {\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return '';\n }\n\n const fieldData = getOption(fields, rule.field);\n\n const fieldParamNames = Object.fromEntries(\n ([...fieldParams.entries()] as [string, Set<string>][]).map(([f, s]) => [f, [...s]])\n );\n\n const processedRule = ruleProcessor(\n rule,\n {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n getNextNamedParam,\n fieldParamNames,\n fieldData,\n },\n { processedParams: params }\n );\n\n if (!isPojo(processedRule)) {\n return '';\n }\n\n const { sql, params: customParams } = processedRule;\n\n if (typeof sql !== 'string' || !sql) {\n return '';\n }\n\n // istanbul ignore else\n if (format === 'parameterized' && Array.isArray(customParams)) {\n params.push(...customParams);\n } else if (format === 'parameterized_named' && isPojo(customParams)) {\n Object.assign(paramsNamed, customParams);\n // `getNextNamedParam` already adds new params to the list, but a custom\n // rule processor might not call it so we need to make sure we add\n // any new params here.\n for (const p of Object.keys(customParams)) fieldParams.get(rule.field)?.add(p);\n }\n\n return sql;\n };\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Rules\n const processedRule = processRule(rule);\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n if (parameterized) {\n return { sql: processRuleGroup(ruleGroup, true), params };\n }\n return { sql: processRuleGroup(ruleGroup, true), params: paramsNamed };\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\n// TODO?: make this configurable\nexport const prismaFallback = {} as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n Record<string, unknown> | undefined\n> = (ruleGroup, options) => {\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return outermost ? prismaFallback : undefined;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n return expressions.length > 0\n ? expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [combinator]: expressions }\n : prismaFallback;\n };\n\n const result = processRuleGroup(convertFromIC(ruleGroup), true);\n\n return ruleGroup.not ? { NOT: result } : result;\n};\n","import type { Op as _OpTypes, WhereOptions } from 'sequelize';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\ntype OpTypes = typeof _OpTypes;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined> = (\n ruleGroup,\n options\n) => {\n // istanbul ignore next\n const {\n fields,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n context = {},\n } = options;\n\n const { sequelizeOperators: Op } = context as {\n sequelizeOperators: OpTypes;\n };\n\n if (!Op) return;\n\n const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): WhereOptions | undefined => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n return;\n }\n\n const combinator = rg.combinator.toUpperCase();\n let hasChildRules = false;\n\n const expressions: Record<string, unknown>[] = rg.rules\n .map(rule => {\n if (isRuleGroup(rule)) {\n const processedRuleGroup = processRuleGroup(rule);\n if (processedRuleGroup) {\n hasChildRules = true;\n return processedRuleGroup;\n }\n return;\n }\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n /* istanbul ignore next */\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n return;\n }\n const fieldData = getOption(fields, rule.field);\n return ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n fieldData,\n });\n })\n .filter(Boolean);\n\n if (expressions.length === 0) return;\n\n const result =\n expressions.length === 1 && !hasChildRules\n ? expressions[0]\n : { [lc(combinator) === 'or' ? Op.or : Op.and]: expressions };\n\n return rg.not ? { [Op.not]: result } : result;\n };\n\n return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSQL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n const {\n fields,\n fallbackExpression,\n getParseNumberBoolean,\n placeholderFieldName,\n placeholderOperatorName,\n placeholderValueName,\n ruleProcessor,\n validateRule,\n validationMap,\n } = options;\n\n const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n // TODO: test for the last case and remove \"ignore\" comment\n return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n }\n\n const processedRules = [];\n let precedingCombinator = '';\n let firstRule = true;\n\n for (const rule of rg.rules) {\n // Independent combinators\n if (typeof rule === 'string') {\n precedingCombinator = rule;\n continue;\n }\n\n // Groups\n if (isRuleGroup(rule)) {\n const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n // istanbul ignore else\n if (processedGroup) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedGroup);\n }\n continue;\n }\n\n // Basic rule validation\n const [validationResult, fieldValidator] = validateRule(rule);\n if (\n !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n rule.field === placeholderFieldName ||\n rule.operator === placeholderOperatorName ||\n (placeholderValueName !== undefined && rule.value === placeholderValueName)\n ) {\n continue;\n }\n\n const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n const fieldData = getOption(fields, rule.field);\n\n const processedRule = ruleProcessor(rule, {\n ...options,\n parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n escapeQuotes,\n fieldData,\n });\n\n if (processedRule) {\n if (!firstRule && precedingCombinator) {\n processedRules.push(precedingCombinator);\n precedingCombinator = '';\n }\n firstRule = false;\n processedRules.push(processedRule);\n }\n }\n\n if (processedRules.length === 0) {\n return fallbackExpression;\n }\n\n return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n };\n\n return processRuleGroup(ruleGroup, true);\n};\n","import type { DefaultOperatorName, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';\ntype RangeRule = (\n | { gt: string | number }\n | { gte: string | number }\n | { lt: string | number }\n | { lte: string | number }\n) & { [k in RangeOperator]?: string | number };\ntype ElasticSearchRule =\n | { range: Record<string, RangeRule> }\n // oxlint-disable-next-line typescript/no-explicit-any\n | { term: Record<string, any> }\n | { exists: { field: string } }\n | { regexp: { [k: string]: { value: string } } };\ntype ElasticSearchQuery = {\n bool:\n | { filter: { script: { script: string } } }\n | { must: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[] }\n | {\n must_not:\n | ElasticSearchRule\n | ElasticSearchQuery\n | (ElasticSearchRule | ElasticSearchQuery)[];\n }\n | {\n should: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[];\n };\n};\n\nconst rangeOperatorMap = { '<': 'lt', '<=': 'lte', '>': 'gt', '>=': 'gte' } satisfies Record<\n '<' | '<=' | '>' | '>=',\n RangeOperator\n>;\n\nconst negateIfNotOp = (\n op: string,\n elasticSearchRule: ElasticSearchRule\n): ElasticSearchQuery | ElasticSearchRule =>\n op.startsWith('not') || op.startsWith('doesnot')\n ? { bool: { must_not: elasticSearchRule } }\n : elasticSearchRule;\n\nconst escapeSQ = (s: string) => s?.replace(/('|\\\\)/g, `\\\\$1`);\n\nconst textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>> = {\n beginswith: 'startsWith',\n doesnotbeginwith: 'startsWith',\n doesnotcontain: 'contains',\n doesnotendwith: 'endsWith',\n endswith: 'endsWith',\n};\nconst getTextScript = (f: string, o: Lowercase<DefaultOperatorName>, v: string) => {\n const script = `doc['${f}'].value.${textFunctionMap[o] ?? o}(doc['${v}'].value)`;\n return o.startsWith('d') ? `!${script}` : script;\n};\n\n// oxlint-disable-next-line typescript/no-explicit-any\nconst valueRenderer = (v: any, parseNumbers?: boolean) =>\n typeof v === 'boolean'\n ? v\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorElasticSearch: RuleProcessor = (\n rule,\n options = {}\n): ElasticSearchQuery | ElasticSearchRule | false => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const operatorLC = lc(operator) as Lowercase<DefaultOperatorName>;\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return false;\n\n if (valueSource === 'field') {\n // Bail out if not all values are strings\n if (toArray(value).some(v => typeof v !== 'string')) return false;\n\n const fieldForScript = escapeSQ(field);\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=': {\n const operatorForScript = operatorLC === '=' ? '==' : operatorLC;\n const valueForScript = escapeSQ(value);\n return valueForScript\n ? {\n bool: {\n filter: {\n script: {\n script: `doc['${fieldForScript}'].value ${operatorForScript} doc['${valueForScript}'].value`,\n },\n },\n },\n }\n : false;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({\n bool: {\n filter: { script: { script: `doc['${fieldForScript}'].value == doc['${v}'].value` } },\n },\n }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (valueAsArray.length >= 2 && valueAsArray[0] && valueAsArray[1]) {\n const script = `doc['${fieldForScript}'].value >= doc['${valueAsArray[0]}'].value && doc['${fieldForScript}'].value <= doc['${valueAsArray[1]}'].value`;\n return {\n bool: {\n filter: { script: { script: operatorLC === 'notbetween' ? `!(${script})` : script } },\n },\n };\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n case 'beginswith':\n case 'doesnotbeginwith':\n case 'endswith':\n case 'doesnotendwith': {\n const valueForScript = escapeSQ(value);\n if (!valueForScript) return false;\n const script = getTextScript(fieldForScript, operatorLC, valueForScript);\n return {\n bool: {\n filter: {\n script: {\n script,\n },\n },\n },\n };\n }\n }\n }\n\n switch (operatorLC) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n return {\n range: {\n [field]: {\n [rangeOperatorMap[operatorLC]]: valueRenderer(value, parseNumbers),\n } as RangeRule,\n },\n };\n\n case '=':\n return { term: { [field]: valueRenderer(value, parseNumbers) } };\n\n case '!=':\n return { bool: { must_not: { term: { [field]: valueRenderer(value, parseNumbers) } } } };\n\n case 'null':\n return { bool: { must_not: { exists: { field } } } };\n\n case 'notnull':\n return { exists: { field } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => valueRenderer(v, parseNumbers));\n if (valueAsArray.length > 0) {\n const arr = valueAsArray.map(v => ({ term: { [field]: valueRenderer(v, parseNumbers) } }));\n return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n }\n return false;\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && secondNum < firstNum) {\n const tempNum = secondNum;\n second = firstNum;\n first = tempNum;\n } else {\n first = firstNum;\n second = secondNum;\n }\n }\n return negateIfNotOp(operatorLC, { range: { [field]: { gte: first, lte: second } } });\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}.*` } } });\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `${value}.*` } } });\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}` } } });\n }\n return false;\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst quote = (v: any, escapeQuotes?: boolean) =>\n `\"${typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`)}\"`;\n\nconst negate = (clause: string, negate: boolean) => (negate ? `$not(${clause})` : clause);\n\nconst escapeStringRegex = (s: string) =>\n `${s}`.replaceAll(/[/$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`).replaceAll('-', String.raw`\\x2d`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJSONata: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const {\n escapeQuotes,\n parseNumbers,\n preserveValueOrder,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n } = options;\n\n const valueIsField = valueSource === 'field';\n const useBareValue =\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint' ||\n shouldRenderAsNumber(value, parseNumbers);\n\n const qfn = (f: string) =>\n getQuotedFieldName(f, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const totalCount = `$count(${qfn(field)})`;\n const filteredCount = `$count($filter(${qfn(field)}, function($v) {${defaultRuleGroupProcessorJSONata(\n transformQuery(value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: r.field ? `$v.${r.field}` : '$v' }),\n }),\n options as FormatQueryFinalOptions\n )}}))`;\n\n switch (mode) {\n case 'all':\n return `${filteredCount} = ${totalCount}`;\n\n case 'none':\n return `${filteredCount} = 0`;\n\n case 'some':\n return `${filteredCount} > 0`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n if (threshold > 0 && threshold < 1) {\n return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n }\n return `${filteredCount} ${op} ${threshold}`;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return `${qfn(field)} ${operatorLC} ${\n valueIsField\n ? qfn(trimIfString(value))\n : useBareValue\n ? trimIfString(value)\n : quote(value, escapeQuotes)\n }`;\n\n case 'contains':\n case 'doesnotcontain':\n return negate(\n `$contains(${qfn(field)}, ${valueIsField ? qfn(trimIfString(value)) : quote(value, escapeQuotes)})`,\n shouldNegate(operatorLC)\n );\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, 0, $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /^${escapeStringRegex(value)}/)`,\n shouldNegate(operatorLC)\n );\n\n case 'endswith':\n case 'doesnotendwith':\n return negate(\n valueIsField\n ? `$substring(${qfn(field)}, $length(${qfn(field)}) - $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n : `$contains(${qfn(field)}, /${escapeStringRegex(value)}$/)`,\n shouldNegate(operatorLC)\n );\n\n case 'null':\n return `${qfn(field)} = null`;\n\n case 'notnull':\n return `${qfn(field)} != null`;\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negate(\n `${qfn(field)} in [${valueAsArray\n .map(val =>\n valueIsField\n ? `${qfn(trimIfString(val))}`\n : shouldRenderAsNumber(val, parseNumbers)\n ? `${trimIfString(val)}`\n : quote(val, escapeQuotes)\n )\n .join(', ')}]`,\n shouldNegate(operatorLC)\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n let secondValue = Number.isNaN(secondNum) ? (valueIsField ? `${second}` : second) : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n const renderAsNumbers =\n shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers);\n const getValueString = (raw: string, val: string | number) =>\n valueIsField ? qfn(raw) : renderAsNumbers ? val : quote(val, escapeQuotes);\n\n const expression = `${qfn(field)} >= ${getValueString(first, firstValue)} and ${qfn(field)} <= ${getValueString(second, secondValue)}`;\n\n return operatorLC === 'between' ? `(${expression})` : negate(expression, true);\n }\n }\n\n return '';\n};\n","import type {\n FormatQueryFinalOptions,\n JsonLogicVar,\n RQBJsonLogic,\n RuleProcessor,\n} from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst convertOperator = (op: '<' | '<=' | '=' | '!=' | '>' | '>=') =>\n op\n .replace(/^(=)$/, '$1=')\n .replace(/^notnull$/i, '!=')\n .replace(/^null$/i, '==') as '<' | '<=' | '==' | '!=' | '===' | '!==' | '>' | '>=';\n\nconst negateIfNotOp = (op: string, jsonRule: RQBJsonLogic) =>\n op.startsWith('not') || op.startsWith('doesnot') ? { '!': jsonRule } : jsonRule;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJsonLogic: RuleProcessor = (rule, options = {}): RQBJsonLogic => {\n const { field, operator, value, valueSource } = rule;\n const { parseNumbers, preserveValueOrder } = options;\n const valueIsField = valueSource === 'field';\n const fieldObject: JsonLogicVar = { var: field };\n const fieldOrNumberRenderer = (v: string) =>\n valueIsField\n ? { var: `${v}` }\n : shouldRenderAsNumber(v, parseNumbers)\n ? parseNumber(v, { parseNumbers })\n : v;\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return false;\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n switch (mode) {\n case 'all':\n case 'none':\n case 'some':\n return {\n [mode]: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n } as RQBJsonLogic;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n const filteredCount = {\n reduce: [\n {\n filter: [\n { var: field },\n value.rules.length === 1 && !isRuleGroup(value.rules[0])\n ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n ],\n },\n { '+': [1, { var: 'accumulator' }] },\n 0,\n ],\n };\n\n if (threshold > 0 && threshold < 1) {\n const totalCount = {\n reduce: [{ var: field }, { '+': [1, { var: 'accumulator' }] }, 0],\n };\n return { [op]: [filteredCount, { '*': [totalCount, threshold] }] } as RQBJsonLogic;\n }\n return { [op]: [filteredCount, threshold] } as RQBJsonLogic;\n }\n }\n }\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '<':\n case '<=':\n case '=':\n case '!=':\n case '>':\n case '>=':\n return {\n [convertOperator(operatorLC)]: [fieldObject, fieldOrNumberRenderer(value)],\n } as RQBJsonLogic;\n\n case 'null':\n case 'notnull': {\n return {\n [`${operatorLC === 'notnull' ? '!' : '='}=`]: [fieldObject, null],\n } as RQBJsonLogic;\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value).map(v => fieldOrNumberRenderer(v));\n return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n let [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n if (\n !valueIsField &&\n shouldRenderAsNumber(first, shouldParseNumbers) &&\n shouldRenderAsNumber(second, shouldParseNumbers)\n ) {\n const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n if (!preserveValueOrder && 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: RQBJsonLogic = { '<=': [first, fieldObject, second] };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n return false;\n }\n\n case 'contains':\n case 'doesnotcontain': {\n const jsonRule: RQBJsonLogic = {\n in: [fieldOrNumberRenderer(value), fieldObject],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'beginswith':\n case 'doesnotbeginwith': {\n const jsonRule: RQBJsonLogic = {\n startsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n\n case 'endswith':\n case 'doesnotendwith': {\n const jsonRule: RQBJsonLogic = {\n endsWith: [fieldObject, fieldOrNumberRenderer(value)],\n };\n return negateIfNotOp(operatorLC, jsonRule);\n }\n }\n return false;\n};\n","import type { RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst negateIf = (clause: string, negate: boolean) => (negate ? `(!${clause})` : `${clause}`);\n\nconst ldapEscape = (s: unknown) =>\n `${trimIfString(s)}`.replaceAll(\n /[()&|=<>~*\\\\/]/g,\n (m: string) => `\\\\${m.codePointAt(0)!.toString(16)}`\n );\n\n/**\n * Default rule processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorLDAP: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n const { preserveValueOrder } = options;\n const operatorLC = lc(operator);\n\n // Bail out if...\n if (\n // This is a field comparison (which LDAP does not support), or\n valueSource === 'field' ||\n // `value` is null/undefined/empty and the operator is not unary, or\n (nullOrUndefinedOrEmpty(value) && operatorLC !== 'null' && operatorLC !== 'notnull') ||\n // a valid `match` property is found (match modes are not supported in this format)\n processMatchMode(rule)\n ) {\n return '';\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n return negateIf(`(${field}=${ldapEscape(value)})`, operatorLC === '!=');\n\n case '>':\n case '>=':\n return `(${field}>=${ldapEscape(value)})`;\n\n case '<':\n case '<=':\n return `(${field}<=${ldapEscape(value)})`;\n\n case 'contains':\n case 'doesnotcontain':\n return negateIf(`(${field}=*${ldapEscape(value)}*)`, operatorLC === 'doesnotcontain');\n\n case 'beginswith':\n case 'doesnotbeginwith':\n return negateIf(`(${field}=${ldapEscape(value)}*)`, operatorLC === 'doesnotbeginwith');\n\n case 'endswith':\n case 'doesnotendwith':\n return negateIf(`(${field}=*${ldapEscape(value)})`, operatorLC === 'doesnotendwith');\n\n case 'null':\n case 'notnull':\n return negateIf(`(${field}=*)`, operatorLC === 'notnull');\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return negateIf(\n `(|${valueAsArray.map(val => `(${field}=${ldapEscape(val)})`).join('')})`,\n operatorLC === 'notin'\n );\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length < 2 ||\n nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n nullOrUndefinedOrEmpty(valueAsArray[1])\n ) {\n return '';\n }\n\n const [first, second] = valueAsArray;\n const firstNum = shouldRenderAsNumber(first, true)\n ? parseNumber(first, { parseNumbers: true })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, true)\n ? parseNumber(second, { parseNumbers: true })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return negateIf(\n `(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`,\n operatorLC === 'notbetween'\n );\n }\n }\n\n // istanbul ignore next\n return '';\n};\n","import type { FullField, ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\nconst escapeStringValueQuotes = (v: unknown, quoteChar: string, escapeQuotes?: boolean) =>\n escapeQuotes && typeof v === 'string'\n ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n : /* istanbul ignore next */ v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorNL: ValueProcessorByRule = (\n rule,\n // istanbul ignore next - defaultRuleProcessorNL always provides options\n opts = {}\n) => {\n const {\n escapeQuotes,\n fields,\n parseNumbers,\n quoteFieldNamesWith,\n quoteValuesWith,\n fieldIdentifierSeparator,\n translations,\n } = opts;\n const valueIsField = rule.valueSource === 'field';\n const operatorLowerCase = lc(rule.operator);\n const quoteChar = quoteValuesWith || /* istanbul ignore next */ \"'\";\n\n // oxlint-disable no-explicit-any\n const quoteValue = (v: any) => `${quoteChar}${v}${quoteChar}`;\n const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n // oxlint-enable no-explicit-any\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const t = translations ?? /* istanbul ignore next */ {};\n const orTL = t.or ?? 'or';\n const trueTL = t.true ?? 'true';\n const falseTL = t.false ?? 'false';\n\n switch (operatorLowerCase) {\n case 'null':\n case 'notnull': {\n return '';\n }\n\n case 'between':\n case 'notbetween': {\n if (!valueIsField) {\n return defaultValueProcessorByRule(rule, opts);\n }\n\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true })\n .slice(0, 2)\n .map(v =>\n wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n );\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return '';\n }\n return defaultValueProcessorByRule({ ...rule, value: valueAsArray }, opts);\n }\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(rule.value);\n if (valueAsArray.length === 0) return '';\n const valStringArray = valueAsArray.map(v =>\n valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n )\n : shouldRenderAsNumber(v, parseNumbers)\n ? `${trimIfString(v)}`\n : `${wrapAndEscape(v)}`\n );\n return `${valStringArray.slice(0, -1).join(', ')}${valStringArray.length > 2 ? ',' : ''} ${orTL} ${valStringArray.at(-1)}`;\n }\n }\n\n if (typeof rule.value === 'boolean') {\n return rule.value ? trueTL : falseTL;\n }\n\n return valueIsField\n ? wrapFieldName(\n getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], rule.value)?.label ??\n rule.value\n )\n : shouldRenderAsNumber(rule.value, parseNumbers)\n ? `${trimIfString(rule.value)}`\n : `${wrapAndEscape(rule.value)}`;\n};\n","import type {\n DefaultOperatorName,\n ExportOperatorMap,\n FormatQueryFinalOptions,\n FullOption,\n RuleProcessor,\n} from '../../types';\nimport { lc } from '../misc';\nimport { getOption, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport { getQuotedFieldName, normalizeConstituentWordOrder, processMatchMode } from './utils';\n\n/**\n * Default operator map used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultExportOperatorMap: ExportOperatorMap = {\n '=': ['is', 'is the same as the value in'],\n '!=': ['is not', 'is not the same as the value in'],\n '<': ['is less than', 'is less than the value in'],\n '>': ['is greater than', 'is greater than the value in'],\n '<=': ['is less than or equal to', 'is less than or equal to the value in'],\n '>=': ['is greater than or equal to', 'is greater than or equal to the value in'],\n contains: ['contains', 'contains the value in'],\n beginswith: ['starts with', 'starts with the value in'],\n endswith: ['ends with', 'ends with the value in'],\n doesnotcontain: ['does not contain', 'does not contain the value in'],\n doesnotbeginwith: ['does not start with', 'does not start with the value in'],\n doesnotendwith: ['does not end with', 'does not end with the value in'],\n null: 'is null',\n notnull: 'is not null',\n in: ['is one of the values', 'is the same as a value in'],\n notin: ['is not one of the values', 'is not the same as any value in'],\n between: ['is between', 'is between the values in'],\n notbetween: ['is not between', 'is not between the values in'],\n};\n\n/* istanbul ignore next */\nconst defaultGetOperators = () => [];\n\n/**\n * Default operator processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorNL: RuleProcessor = (\n rule,\n // istanbul ignore next\n opts = {}\n) => {\n const { field, operator, valueSource = 'value' } = rule;\n // istanbul ignore next\n const {\n getOperators = defaultGetOperators,\n operatorMap: operatorMapParam = defaultExportOperatorMap,\n } = opts;\n\n const mapOperatorMap = new Map<string, string | [string, string]>(\n Object.entries(defaultExportOperatorMap)\n );\n for (const [key, value] of Object.entries(operatorMapParam)) {\n mapOperatorMap.set(lc(key), value);\n }\n const operatorMap = Object.fromEntries(mapOperatorMap);\n\n const { value: operatorNL, label } = getOption(\n toFullOptionList(\n getOperators(field, {\n fieldData: opts.fieldData ?? {\n name: field,\n value: field,\n label: field,\n },\n }) ?? /* istanbul ignore next */ []\n ) as FullOption[],\n operator\n ) ?? {\n name: operator,\n value: operator,\n label: operator,\n };\n\n const operatorTL = operatorMap[operatorNL as DefaultOperatorName] ??\n operatorMap[lc(operatorNL) as Lowercase<DefaultOperatorName>] ?? [label, label];\n\n return typeof operatorTL === 'string' ? operatorTL : operatorTL[valueSource === 'field' ? 1 : 0];\n};\n\n/**\n * Default rule processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorNL: RuleProcessor = (rule, opts) => {\n const { field, operator } = rule;\n // istanbul ignore next\n const {\n fieldData,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorNL,\n valueProcessor = defaultValueProcessorNL,\n concatOperator = '||',\n wordOrder = 'SVO',\n } = opts ?? /* istanbul ignore next */ {};\n\n const processedField = getQuotedFieldName(fieldData?.label ?? field, {\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n });\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return '';\n } else if (matchEval) {\n const { mode, threshold } = matchEval;\n\n const nestedArrayFilter = defaultRuleGroupProcessorNL(rule.value, {\n ...(opts as FormatQueryFinalOptions),\n fields: toFullOptionList(fieldData?.subproperties ?? []),\n });\n\n // (H)as (S)ub(P)roperties\n const hsp = (fieldData?.subproperties?.length ?? 0) > 0;\n\n switch (mode) {\n case 'all':\n return `(${hsp ? 'for ' : ''}every item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'none':\n return `(${hsp ? 'for ' : ''}no item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'some':\n return `(${hsp ? 'for ' : ''}at least one item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const mm = mode.replace('at', 'at ');\n if (threshold > 0 && threshold < 1) {\n return `(${hsp ? 'for ' : ''}${mm} ${threshold * 100}% of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n return `(${hsp ? 'for ' : ''}${mm} ${threshold} of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operatorLC = lc(operator);\n if (\n (operatorLC === 'in' ||\n operatorLC === 'notin' ||\n operatorLC === 'between' ||\n operatorLC === 'notbetween') &&\n !value\n ) {\n return '';\n }\n\n const processedOperator = operatorProcessor(rule, opts);\n\n const wordOrderMap = {\n S: processedField,\n V: processedOperator,\n O: value,\n };\n\n return normalizeConstituentWordOrder(wordOrder)\n .map(term => `${wordOrderMap[term]}`)\n .join(' ')\n .trim();\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { lc } from '../misc';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, mapSQLOperator, processMatchMode } from './utils';\n\n/**\n * Default operator processor used by {@link formatQuery} for \"sql\" and \"parameterized*\" formats.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorSQL: RuleProcessor = rule => lc(mapSQLOperator(rule.operator));\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSQL: RuleProcessor = (rule, opts = {}) => {\n const {\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator = '',\n quoteValuesWith = `'`,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n concatOperator = '||',\n } = opts;\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return '';\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const nestedArrayFilter = defaultRuleGroupProcessorSQL(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n opts as FormatQueryFinalOptions\n );\n\n switch (mode) {\n case 'all':\n return `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) = array_length(${ruleField}, 1)`;\n\n case 'none':\n return `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'some':\n return `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;\n }\n }\n }\n\n const value = valueProcessor(rule, {\n ...opts,\n quoteFieldNamesWith,\n fieldIdentifierSeparator,\n quoteValuesWith,\n concatOperator,\n });\n\n const operator = operatorProcessor(rule, opts);\n\n const operatorLowerCase = lc(operator);\n if (\n (operatorLowerCase === 'in' ||\n operatorLowerCase === 'not in' ||\n operatorLowerCase === 'between' ||\n operatorLowerCase === 'not between') &&\n !value\n ) {\n return '';\n }\n\n return `${ruleField} ${operator} ${value}`.trim();\n};\n","import type { FormatQueryFinalOptions, FullField, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultOperatorProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleProcessorParameterized: RuleProcessor = (rule, opts, meta) => {\n // TODO?: test for this so we don't have to ignore it\n // istanbul ignore next\n const {\n fieldData,\n format,\n getNextNamedParam,\n parseNumbers,\n paramPrefix,\n paramsKeepPrefix,\n numberedParams,\n quoteFieldNamesWith = ['', ''] as [string, string],\n fieldIdentifierSeparator,\n concatOperator,\n operatorProcessor = defaultOperatorProcessorSQL,\n valueProcessor = defaultValueProcessorByRule,\n } = opts ?? {};\n\n const { processedParams = [] } = meta ?? {};\n\n const parameterized = format === 'parameterized';\n // oxlint-disable-next-line typescript/no-explicit-any\n const params: any[] = [];\n // oxlint-disable-next-line typescript/no-explicit-any\n const paramsNamed: Record<string, any> = {};\n\n const finalize = (sql: string) =>\n parameterized ? { sql, params } : { sql, params: paramsNamed };\n\n const wrapFieldName = (v: string) =>\n getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n const ruleField = wrapFieldName(rule.field);\n\n const matchEval = processMatchMode(rule);\n\n if (matchEval === false) {\n return;\n } else if (matchEval) {\n // We only support PostgreSQL nested arrays\n if (opts?.preset !== 'postgresql') return finalize('');\n\n const { mode, threshold } = matchEval;\n\n // TODO?: Randomize this alias\n const arrayElementAlias = 'elem_alias';\n\n const { sql: nestedSQL, params: nestedParams } = defaultRuleGroupProcessorParameterized(\n transformQuery(rule.value as RuleGroupType, {\n ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n }),\n { ...(opts as FormatQueryFinalOptions), fields: [] as FullField[] }\n );\n // Ignore the \"parameterized_named\" case because PostgreSQL doesn't support named parameters\n // istanbul ignore else\n if (Array.isArray(nestedParams)) {\n params.push(...nestedParams);\n } else {\n Object.assign(paramsNamed, nestedParams);\n }\n\n switch (mode) {\n case 'all':\n return finalize(\n `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) = array_length(${ruleField}, 1)`\n );\n\n case 'none':\n return finalize(\n `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'some':\n return finalize(\n `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n );\n\n case 'atleast':\n case 'atmost':\n case 'exactly': {\n const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n return finalize(\n `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`\n );\n }\n }\n }\n\n const value = valueProcessor(rule, {\n parseNumbers,\n quoteFieldNamesWith,\n concatOperator,\n fieldData,\n format,\n });\n\n const sqlOperator = operatorProcessor(rule, opts);\n const sqlOperatorLowerCase = lc(sqlOperator);\n const [qPre, qPost] = quoteFieldNamesWith;\n\n if (\n (sqlOperatorLowerCase === 'in' ||\n sqlOperatorLowerCase === 'not in' ||\n sqlOperatorLowerCase === 'between' ||\n sqlOperatorLowerCase === 'not between') &&\n !value\n ) {\n return finalize('');\n } else if (sqlOperatorLowerCase === 'is null' || sqlOperatorLowerCase === 'is not null') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator}`);\n } else if (rule.valueSource === 'field') {\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} ${value}`.trim());\n } else if (sqlOperatorLowerCase === 'in' || sqlOperatorLowerCase === 'not in') {\n const splitValue = toArray(rule.value);\n if (parameterized) {\n for (const v of splitValue) {\n params.push(shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v);\n }\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} (${splitValue\n .map((_v, i) =>\n numberedParams\n ? `${paramPrefix}${processedParams.length + 1 + splitValue.length - (splitValue.length - i)}`\n : '?'\n )\n .join(', ')})`\n );\n }\n const inParams: string[] = [];\n for (const v of splitValue) {\n const thisParamName = getNextNamedParam!(rule.field);\n inParams.push(`${paramPrefix}${thisParamName}`);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${thisParamName}`] = shouldRenderAsNumber(\n v,\n parseNumbers\n )\n ? parseNumber(v, { parseNumbers })\n : v;\n }\n return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} (${inParams.join(', ')})`);\n } else if (sqlOperatorLowerCase === 'between' || sqlOperatorLowerCase === 'not between') {\n const valueAsArray = toArray(rule.value, { retainEmptyStrings: true });\n const [first, second] = valueAsArray\n .slice(0, 2)\n .map(v => (shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v));\n if (parameterized) {\n params.push(first, second);\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n numberedParams ? `${paramPrefix}${processedParams.length + 1}` : '?'\n } and ${numberedParams ? `${paramPrefix}${processedParams.length + 2}` : '?'}`\n );\n }\n const firstParamName = getNextNamedParam!(rule.field);\n const secondParamName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${firstParamName}`] = first;\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${secondParamName}`] = second;\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${paramPrefix}${firstParamName} and ${paramPrefix}${secondParamName}`\n );\n }\n\n let paramValue = rule.value;\n if (typeof rule.value === 'string') {\n if (shouldRenderAsNumber(rule.value, parseNumbers)) {\n paramValue = parseNumber(rule.value, { parseNumbers });\n } else {\n // Note that we're using `value` here, which has been processed through\n // a `valueProcessor`, as opposed to `rule.value` which has not\n paramValue = /^'.*'$/g.test(value)\n ? value.replaceAll(/(^'|'$)/g, '')\n : /* istanbul ignore next */ value;\n }\n }\n\n let paramName = '';\n if (parameterized) {\n params.push(paramValue);\n } else {\n paramName = getNextNamedParam!(rule.field);\n paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${paramName}`] = paramValue;\n }\n\n return finalize(\n `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n parameterized\n ? numberedParams\n ? `${paramPrefix}${processedParams.length + 1}`\n : '?'\n : `${paramPrefix}${paramName}`\n }`.trim()\n );\n};\n","import type { ParseNumbersPropConfig, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, prismaOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers?: ParseNumbersPropConfig) =>\n shouldRenderAsNumber(value, !!parseNumbers || typeof value === 'bigint')\n ? Number(parseNumber(value, { parseNumbers: !!parseNumbers }))\n : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorPrisma: RuleProcessor = (\n rule,\n // istanbul ignore next\n options = {}\n) => {\n const { field, operator, value, valueSource } = rule;\n // istanbul ignore next\n const { parseNumbers, preserveValueOrder } = options;\n\n // Neither field-to-field comparisons nor match modes are supported in this format\n if (valueSource === 'field' || processMatchMode(rule)) return;\n\n const operatorLC = lc(operator);\n switch (operatorLC) {\n case '=':\n return { [field]: processNumber(value, value, parseNumbers) };\n\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const prismaOperator = prismaOperators[operatorLC];\n return {\n [field]: {\n [prismaOperator]: processNumber(value, value, parseNumbers),\n },\n };\n }\n\n case 'contains':\n return { [field]: { contains: value } };\n\n case 'beginswith':\n return { [field]: { startsWith: value } };\n\n case 'endswith':\n return { [field]: { endsWith: value } };\n\n case 'doesnotcontain':\n return { NOT: { [field]: { contains: value } } };\n\n case 'doesnotbeginwith':\n return { NOT: { [field]: { startsWith: value } } };\n\n case 'doesnotendwith':\n return { NOT: { [field]: { endsWith: value } } };\n\n case 'null':\n return { [field]: null };\n\n case 'notnull':\n return { [field]: { not: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [prismaOperators[operatorLC]]: valueAsArray.map(val =>\n processNumber(val, val, parseNumbers)\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value);\n if (\n valueAsArray.length >= 2 &&\n isValidValue(valueAsArray[0]) &&\n isValidValue(valueAsArray[1])\n ) {\n const [first, second] = valueAsArray;\n // For backwards compatibility, default to parsing numbers for between operators\n // unless parseNumbers is explicitly set to false\n const shouldParseNumbers = !(parseNumbers === false);\n const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n ? parseNumber(first, { parseNumbers })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n ? parseNumber(second, { parseNumbers })\n : Number.NaN;\n let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n const tempNum = secondNum;\n secondValue = firstNum;\n firstValue = tempNum;\n }\n\n return operatorLC === 'between'\n ? { [field]: { gte: firstValue, lte: secondValue } }\n : { OR: [{ [field]: { lt: firstValue } }, { [field]: { gt: secondValue } }] };\n } else {\n return '';\n }\n }\n }\n return '';\n};\n","import type { Op as _OpTypes, col as _colType, fn as _fnType } from 'sequelize';\nimport type { Simplify } from 'type-fest';\nimport type { RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype OpTypes = Simplify<typeof _OpTypes>;\ntype ColType = typeof _colType;\ntype FnType = typeof _fnType;\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSequelize: RuleProcessor = (\n rule,\n // istanbul ignore next\n { parseNumbers, preserveValueOrder, context = {} } = {}\n): Record<string, unknown> | undefined => {\n const {\n sequelizeOperators: Op,\n sequelizeCol: col,\n sequelizeFn: fn,\n } = context as {\n sequelizeOperators: OpTypes;\n sequelizeCol?: ColType;\n sequelizeFn?: FnType;\n };\n\n // Match modes are not supported in this format\n if (processMatchMode(rule)) return;\n\n const { field, operator, value, valueSource } = rule;\n const valueIsField = valueSource === 'field';\n\n const operatorLC = lc(operator);\n\n if (\n // Bail out if we don't have the Op symbols\n !Op ||\n // ...or valueSource is 'field' and we don't have the `col` function,\n (valueIsField &&\n (!col ||\n // ...or valueSource is 'field' and we don't have the `fn` function\n // and the operator is one of the \"doesNot*\" ones\n (!fn && ['doesnotcontain', 'doesnotbeginwith', 'doesnotendwith'].includes(operatorLC))))\n ) {\n return;\n }\n\n switch (operatorLC) {\n case '=':\n case '!=':\n case '<':\n case '<=':\n case '>':\n case '>=': {\n const sequelizeOperator = {\n '=': Op.eq,\n '!=': Op.ne,\n '<': Op.lt,\n '<=': Op.lte,\n '>': Op.gt,\n '>=': Op.gte,\n }[operatorLC];\n return {\n [field]:\n valueIsField && operatorLC === '='\n ? { [Op.col]: value }\n : {\n [sequelizeOperator]: valueIsField\n ? col!(value)\n : shouldRenderAsNumber(value, parseNumbers)\n ? parseNumber(value, { parseNumbers: 'strict' })\n : value,\n },\n };\n }\n\n case 'contains':\n return { [field]: { [Op.substring]: valueIsField ? col!(value) : `${value}` } };\n\n case 'beginswith':\n return { [field]: { [Op.startsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'endswith':\n return { [field]: { [Op.endsWith]: valueIsField ? col!(value) : `${value}` } };\n\n case 'doesnotcontain':\n return {\n [field]: {\n [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value), '%') : `%${value}%`,\n },\n };\n\n case 'doesnotbeginwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', col!(value), '%') : `${value}%` },\n };\n\n case 'doesnotendwith':\n return {\n [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value)) : `%${value}` },\n };\n\n case 'null':\n return { [field]: { [Op.is]: null } };\n\n case 'notnull':\n return { [field]: { [Op.not]: null } };\n\n case 'in':\n case 'notin': {\n const valueAsArray = toArray(value);\n return {\n [field]: {\n [operatorLC === 'in' ? Op.in : Op.notIn]: valueAsArray.map(val =>\n valueIsField\n ? col!(val)\n : shouldRenderAsNumber(val, parseNumbers)\n ? parseNumber(val, { parseNumbers: 'strict' })\n : val\n ),\n },\n };\n }\n\n case 'between':\n case 'notbetween': {\n const valueAsArray = toArray(value, { retainEmptyStrings: true });\n if (\n valueAsArray.length < 2 ||\n !isValidValue(valueAsArray[0]) ||\n !isValidValue(valueAsArray[1])\n ) {\n return;\n }\n\n const [first, second] = valueAsArray;\n\n const firstNum = shouldRenderAsNumber(first, parseNumbers)\n ? parseNumber(first, { parseNumbers: 'strict' })\n : Number.NaN;\n const secondNum = shouldRenderAsNumber(second, parseNumbers)\n ? parseNumber(second, { parseNumbers: 'strict' })\n : Number.NaN;\n const firstValue = Number.isNaN(firstNum) ? first : firstNum;\n const secondValue = Number.isNaN(secondNum) ? second : secondNum;\n const valsOneAndTwoOnly = [firstValue, secondValue];\n if (\n !preserveValueOrder &&\n firstValue === firstNum &&\n secondValue === secondNum &&\n secondNum < firstNum\n ) {\n valsOneAndTwoOnly[0] = secondNum;\n valsOneAndTwoOnly[1] = firstNum;\n }\n\n return {\n [field]: {\n [operatorLC === 'between' ? Op.between : Op.notBetween]: valueIsField\n ? valsOneAndTwoOnly.map(v => col!(v))\n : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n : valsOneAndTwoOnly,\n },\n };\n }\n }\n return;\n};\n","import { produce } from 'immer';\nimport type { SetOptional } from 'type-fest';\nimport { defaultPlaceholderFieldName, defaultPlaceholderOperatorName } from '../../defaults';\nimport type {\n ExportFormat,\n ExportObjectFormats,\n FormatQueryFinalOptions,\n FormatQueryOptions,\n FullField,\n FullOperator,\n FullOptionList,\n InputType,\n ParameterizedNamedSQL,\n ParameterizedSQL,\n RQBJsonLogic,\n RuleGroupProcessor,\n RuleGroupTypeAny,\n RuleProcessor,\n RuleType,\n RuleValidator,\n SQLPreset,\n ValidationMap,\n ValidationResult,\n ValueProcessorByRule,\n} from '../../types';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { lc } from '../misc';\nimport { toFlatOptionArray, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { defaultRuleGroupProcessorElasticSearch } from './defaultRuleGroupProcessorElasticSearch';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { defaultRuleGroupProcessorLDAP } from './defaultRuleGroupProcessorLDAP';\nimport { defaultRuleGroupProcessorMongoDB } from './defaultRuleGroupProcessorMongoDB';\nimport {\n defaultRuleGroupProcessorMongoDBQuery,\n mongoDbFallback,\n} from './defaultRuleGroupProcessorMongoDBQuery';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultRuleGroupProcessorPrisma, prismaFallback } from './defaultRuleGroupProcessorPrisma';\nimport { defaultRuleGroupProcessorSequelize } from './defaultRuleGroupProcessorSequelize';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\nimport { defaultRuleProcessorElasticSearch } from './defaultRuleProcessorElasticSearch';\nimport { defaultRuleProcessorJSONata } from './defaultRuleProcessorJSONata';\nimport { defaultRuleProcessorJsonLogic } from './defaultRuleProcessorJsonLogic';\nimport { defaultRuleProcessorLDAP } from './defaultRuleProcessorLDAP';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\nimport { defaultOperatorProcessorNL, defaultRuleProcessorNL } from './defaultRuleProcessorNL';\nimport { defaultRuleProcessorParameterized } from './defaultRuleProcessorParameterized';\nimport { defaultRuleProcessorPrisma } from './defaultRuleProcessorPrisma';\nimport { defaultRuleProcessorSequelize } from './defaultRuleProcessorSequelize';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultOperatorProcessorSQL, defaultRuleProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport {\n bigIntJsonStringifyReplacer,\n getQuoteFieldNamesWithArray,\n isValueProcessorLegacy,\n numerifyValues,\n} from './utils';\n\n/**\n * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.\n *\n * @group Export\n */\nexport const sqlDialectPresets: Record<SQLPreset, FormatQueryOptions> = {\n ansi: {}, // This should always be empty\n sqlite: {\n paramsKeepPrefix: true,\n },\n oracle: {},\n mssql: {\n concatOperator: '+',\n quoteFieldNamesWith: ['[', ']'],\n fieldIdentifierSeparator: '.',\n paramPrefix: '@',\n },\n mysql: {\n concatOperator: 'CONCAT',\n },\n postgresql: {\n quoteFieldNamesWith: '\"',\n numberedParams: true,\n paramPrefix: '$',\n },\n};\n\n/**\n * A collection of option presets for {@link formatQuery}.\n *\n * @group Export\n */\nexport const formatQueryOptionPresets: Record<string, FormatQueryOptions> = {\n ...sqlDialectPresets,\n};\n\nconst defaultRuleProcessors = {\n cel: defaultRuleProcessorCEL,\n drizzle: defaultRuleProcessorDrizzle,\n elasticsearch: defaultRuleProcessorElasticSearch,\n json_without_ids: defaultRuleProcessorSQL,\n json: defaultRuleProcessorSQL,\n jsonata: defaultRuleProcessorJSONata,\n jsonlogic: defaultRuleProcessorJsonLogic,\n ldap: defaultRuleProcessorLDAP,\n mongodb_query: defaultRuleProcessorMongoDBQuery,\n mongodb: defaultRuleProcessorMongoDB,\n natural_language: defaultRuleProcessorNL,\n parameterized_named: defaultRuleProcessorParameterized,\n parameterized: defaultRuleProcessorParameterized,\n prisma: defaultRuleProcessorPrisma,\n sequelize: defaultRuleProcessorSequelize,\n spel: defaultRuleProcessorSpEL,\n sql: defaultRuleProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\n/* istanbul ignore next */\nconst defaultOperatorProcessor: RuleProcessor = r => r.operator;\nconst defaultOperatorProcessors = {\n cel: defaultOperatorProcessor,\n drizzle: defaultOperatorProcessor,\n elasticsearch: defaultOperatorProcessor,\n json_without_ids: defaultOperatorProcessor,\n json: defaultOperatorProcessor,\n jsonata: defaultOperatorProcessor,\n jsonlogic: defaultOperatorProcessor,\n ldap: defaultOperatorProcessor,\n mongodb_query: defaultOperatorProcessor,\n mongodb: defaultOperatorProcessor,\n natural_language: defaultOperatorProcessorNL,\n parameterized_named: defaultOperatorProcessorSQL,\n parameterized: defaultOperatorProcessorSQL,\n prisma: defaultOperatorProcessor,\n sequelize: defaultOperatorProcessor,\n spel: defaultOperatorProcessor,\n sql: defaultOperatorProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\nconst defaultFallbackExpressions: Partial<Record<ExportFormat, string>> = {\n cel: '1 == 1',\n ldap: '',\n mongodb: '\"$and\":[{\"$expr\":true}]',\n natural_language: '1 is 1',\n spel: '1 == 1',\n sql: '(1 = 1)',\n};\n\ntype MostFormatQueryOptions = SetOptional<\n Required<FormatQueryOptions>,\n | 'context'\n | 'fallbackExpression'\n | 'operatorProcessor'\n | 'ruleGroupProcessor'\n | 'ruleProcessor'\n | 'validator'\n | 'valueProcessor'\n | 'placeholderValueName'\n | 'parseNumbers'\n>;\n\nconst defaultFormatQueryOptions = {\n format: 'json',\n fields: [] as FullOptionList<FullField>,\n quoteFieldNamesWith: ['', ''],\n fieldIdentifierSeparator: '',\n getOperators: () => [] as FullOptionList<FullOperator>,\n paramPrefix: ':',\n paramsKeepPrefix: false,\n numberedParams: false,\n preserveValueOrder: false,\n placeholderFieldName: defaultPlaceholderFieldName,\n placeholderOperatorName: defaultPlaceholderOperatorName,\n quoteValuesWith: \"'\",\n concatOperator: '||',\n preset: 'ansi',\n wordOrder: 'SVO',\n translations: {},\n operatorMap: {},\n} satisfies MostFormatQueryOptions;\n\nconst valueProcessorCanActAsRuleProcessor = new Set<ExportFormat>([\n 'cel',\n 'drizzle',\n 'elasticsearch',\n 'jsonata',\n 'jsonlogic',\n 'ldap',\n 'mongodb_query',\n 'mongodb',\n 'prisma',\n 'sequelize',\n 'spel',\n]);\n\nconst sqlFormats = new Set<ExportFormat>([\n 'sql',\n 'parameterized',\n 'parameterized_named',\n 'drizzle',\n 'prisma',\n 'sequelize',\n]);\n\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny): string;\n/**\n * Generates a result based on the provided rule group processor.\n *\n * @group Export\n */\nfunction formatQuery<TResult = unknown>(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { ruleGroupProcessor: RuleGroupProcessor<TResult> }\n): TResult;\n/**\n * Generates a {@link index!ParameterizedSQL ParameterizedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized' | (FormatQueryOptions & { format: 'parameterized' })\n): ParameterizedSQL;\n/**\n * Generates a {@link index!ParameterizedNamedSQL ParameterizedNamedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'parameterized_named' | (FormatQueryOptions & { format: 'parameterized_named' })\n): ParameterizedNamedSQL;\n/**\n * Generates a {@link index!RQBJsonLogic JsonLogic} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonlogic' | (FormatQueryOptions & { format: 'jsonlogic' })\n): RQBJsonLogic;\n/**\n * Generates an ElasticSearch query object from an RQB query object.\n *\n * NOTE: Support for the ElasticSearch format is experimental.\n * You may have better results exporting \"sql\" format then using\n * [ElasticSearch SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html).\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'elasticsearch' | (FormatQueryOptions & { format: 'elasticsearch' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb\" format, but returns a JSON object\n * instead of a string.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb_query' | (FormatQueryOptions & { format: 'mongodb_query' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a JSON.stringify'd MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb_query\" format, but returns a string\n * instead of a JSON object.\n *\n * @deprecated Use the \"mongodb_query\" format for greater flexibility.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'mongodb' | (FormatQueryOptions & { format: 'mongodb' })\n): string;\n/**\n * Generates a Prisma ORM query object from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'prisma' | (FormatQueryOptions & { format: 'prisma' })\n // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a Drizzle ORM query function from an RQB query object. The function can\n * be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'drizzle' | (FormatQueryOptions & { format: 'drizzle' })\n): ReturnType<typeof defaultRuleGroupProcessorDrizzle>;\n/**\n * Generates a Sequelize query object from an RQB query object. The object can\n * be assigned to the `where` property in the Sequelize query functions.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'sequelize' | (FormatQueryOptions & { format: 'sequelize' })\n): ReturnType<typeof defaultRuleGroupProcessorSequelize>;\n/**\n * Generates a JSONata query string from an RQB query object.\n *\n * NOTE: Either `parseNumbers: \"strict-limited\"` or `parseNumbers: true`\n * are recommended for this format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'jsonata' | (FormatQueryOptions & { format: 'jsonata' })\n): string;\n/**\n * Generates an LDAP query string from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: 'ldap' | (FormatQueryOptions & { format: 'ldap' })\n): string;\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny, options: FormatQueryOptions): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: Exclude<ExportFormat, ExportObjectFormats>\n): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n options: FormatQueryOptions & { format: Exclude<ExportFormat, ExportObjectFormats> }\n): string;\nfunction formatQuery(\n ruleGroup: RuleGroupTypeAny,\n optionParam: FormatQueryOptions | ExportFormat = {}\n) {\n const options = typeof optionParam === 'string' ? { format: lc(optionParam) } : optionParam;\n\n const optObj: MostFormatQueryOptions = {\n ...defaultFormatQueryOptions,\n ...(!options.format || sqlFormats.has(options.format)\n ? (sqlDialectPresets[options.preset ?? 'ansi'] ?? null)\n : null),\n ...options,\n ...(!options.format &&\n (Object.keys(sqlDialectPresets).includes(options.preset ?? '') ? { format: 'sql' } : null)),\n };\n\n const format = lc(optObj.format);\n\n const {\n fallbackExpression: fallbackExpression_option,\n getOperators: getOperators_option,\n operatorProcessor: operatorProcessor_option,\n parseNumbers,\n quoteFieldNamesWith: quoteFieldNamesWith_option,\n ruleGroupProcessor: ruleGroupProcessor_option,\n ruleProcessor: ruleProcessor_option,\n validator,\n valueProcessor: valueProcessor_option,\n context,\n } = optObj;\n\n const getParseNumberBoolean = (inputType?: InputType | null): boolean | undefined => {\n const parseNumberMethod = getParseNumberMethod({ parseNumbers, inputType });\n return typeof parseNumberMethod === 'string'\n ? true\n : typeof parseNumbers === 'boolean'\n ? parseNumbers\n : undefined;\n };\n\n const operatorProcessor =\n typeof operatorProcessor_option === 'function'\n ? operatorProcessor_option\n : (defaultOperatorProcessors[format] ?? defaultOperatorProcessor);\n\n const valueProcessor: ValueProcessorByRule =\n typeof valueProcessor_option === 'function'\n ? isValueProcessorLegacy(valueProcessor_option)\n ? r => valueProcessor_option(r.field, r.operator, r.value, r.valueSource)\n : valueProcessor_option\n : format === 'natural_language'\n ? defaultValueProcessorNL\n : valueProcessorCanActAsRuleProcessor.has(format)\n ? (ruleProcessor_option ?? defaultRuleProcessors[format])\n : defaultValueProcessorByRule;\n\n const ruleProcessor =\n (typeof ruleProcessor_option === 'function' ? ruleProcessor_option : null) ??\n (valueProcessorCanActAsRuleProcessor.has(format) &&\n typeof ruleProcessor_option !== 'function' &&\n valueProcessor_option\n ? valueProcessor\n : null) ??\n defaultRuleProcessors[format] ??\n defaultRuleProcessorSQL;\n\n const quoteFieldNamesWith = getQuoteFieldNamesWithArray(quoteFieldNamesWith_option);\n const fields = toFullOptionList(optObj.fields) as FullOptionList<FullField>;\n const getOperators: FormatQueryOptions['getOperators'] = (f, m) =>\n toFullOptionList(getOperators_option(f, m) ?? /* istanbul ignore next */ []);\n\n const fallbackExpression =\n fallbackExpression_option ??\n defaultFallbackExpressions[format] ??\n defaultFallbackExpressions.sql!;\n\n // #region Validation\n let validationMap: ValidationMap = {};\n\n // istanbul ignore else\n if (typeof validator === 'function') {\n const validationResult = validator(ruleGroup);\n if (typeof validationResult === 'boolean') {\n // istanbul ignore else\n if (!validationResult) {\n return format === 'parameterized'\n ? { sql: fallbackExpression, params: [] }\n : format === 'parameterized_named'\n ? { sql: fallbackExpression, params: {} }\n : format === 'mongodb'\n ? `{${fallbackExpression}}`\n : format === 'mongodb_query'\n ? mongoDbFallback\n : format === 'prisma'\n ? prismaFallback\n : format === 'jsonlogic'\n ? false\n : format === 'elasticsearch'\n ? {}\n : format === 'drizzle' || format === 'sequelize'\n ? undefined\n : fallbackExpression;\n }\n } else {\n validationMap = validationResult;\n }\n }\n\n const validatorMap: Record<string, RuleValidator> = {};\n const uniqueFields = toFlatOptionArray(fields) satisfies FullField[];\n for (const f of uniqueFields) {\n // istanbul ignore else\n if (typeof f.validator === 'function') {\n validatorMap[f.value ?? /* istanbul ignore next */ f.name] = f.validator;\n }\n }\n\n const validateRule = (rule: RuleType) => {\n let validationResult: boolean | ValidationResult | undefined;\n let fieldValidator: RuleValidator | undefined;\n if (rule.id) {\n validationResult = validationMap[rule.id];\n }\n if (uniqueFields.length > 0) {\n const fieldArr = uniqueFields.filter(f => f.name === rule.field);\n if (fieldArr.length > 0) {\n const field = fieldArr[0];\n // istanbul ignore else\n if (typeof field.validator === 'function') {\n fieldValidator = field.validator;\n }\n }\n }\n return [validationResult, fieldValidator] as const;\n };\n // #endregion\n\n const finalOptions: FormatQueryFinalOptions = {\n ...optObj,\n fallbackExpression,\n fields,\n format,\n getOperators,\n getParseNumberBoolean,\n quoteFieldNamesWith,\n operatorProcessor,\n ruleProcessor,\n valueProcessor,\n validateRule,\n validationMap,\n context,\n };\n\n if (typeof ruleGroupProcessor_option === 'function') {\n return ruleGroupProcessor_option(ruleGroup, finalOptions);\n }\n\n switch (format) {\n case 'json':\n case 'json_without_ids': {\n const rg = parseNumbers\n ? produce(ruleGroup, g => numerifyValues(g, finalOptions))\n : ruleGroup;\n if (format === 'json_without_ids') {\n return JSON.stringify(rg, (key, value) =>\n // Remove `id` and `path` keys; leave everything else unchanged.\n key === 'id' || key === 'path' ? undefined : bigIntJsonStringifyReplacer(key, value)\n );\n }\n return JSON.stringify(rg, bigIntJsonStringifyReplacer, 2);\n }\n\n case 'sql':\n return defaultRuleGroupProcessorSQL(ruleGroup, finalOptions);\n\n case 'parameterized':\n case 'parameterized_named':\n return defaultRuleGroupProcessorParameterized(ruleGroup, finalOptions);\n\n case 'mongodb':\n return defaultRuleGroupProcessorMongoDB(ruleGroup, finalOptions);\n\n case 'mongodb_query':\n return defaultRuleGroupProcessorMongoDBQuery(ruleGroup, finalOptions);\n\n case 'cel':\n return defaultRuleGroupProcessorCEL(ruleGroup, finalOptions);\n\n case 'spel':\n return defaultRuleGroupProcessorSpEL(ruleGroup, finalOptions);\n\n case 'jsonata':\n return defaultRuleGroupProcessorJSONata(ruleGroup, finalOptions);\n\n case 'jsonlogic':\n return defaultRuleGroupProcessorJsonLogic(ruleGroup, finalOptions);\n\n case 'elasticsearch':\n return defaultRuleGroupProcessorElasticSearch(ruleGroup, finalOptions);\n\n case 'natural_language':\n return defaultRuleGroupProcessorNL(ruleGroup, finalOptions);\n\n case 'ldap':\n return defaultRuleGroupProcessorLDAP(ruleGroup, finalOptions);\n\n case 'prisma':\n return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);\n\n case 'drizzle':\n return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);\n\n case 'sequelize':\n return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);\n\n default:\n return '';\n }\n}\n\nexport { formatQuery };\n","/**\n * Converts a given query object into one of the supported {@link index!ExportFormat ExportFormat} formats.\n *\n * @module formatQuery\n */\n\nimport type { RuleProcessor, ValueProcessorByRule, ValueProcessorLegacy } from '../../types';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\n\nconst generateValueProcessor =\n (vpbr: ValueProcessorByRule): ValueProcessorLegacy =>\n (field, operator, value, valueSource) =>\n vpbr({ field, operator, value, valueSource }, { parseNumbers: false });\n// TODO: Deprecate defaultValueProcessor.\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultValueProcessorByRule\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultMongoDBValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n defaultRuleProcessorMongoDB\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultCELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorCEL);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultSpELValueProcessor: ValueProcessorLegacy =\n generateValueProcessor(defaultRuleProcessorSpEL);\n\nexport * from './defaultRuleGroupProcessorCEL';\nexport * from './defaultRuleGroupProcessorDrizzle';\nexport * from './defaultRuleGroupProcessorElasticSearch';\nexport * from './defaultRuleGroupProcessorJSONata';\nexport * from './defaultRuleGroupProcessorJsonLogic';\nexport * from './defaultRuleGroupProcessorLDAP';\nexport * from './defaultRuleGroupProcessorMongoDB';\nexport * from './defaultRuleGroupProcessorMongoDBQuery';\nexport * from './defaultRuleGroupProcessorNL';\nexport * from './defaultRuleGroupProcessorParameterized';\nexport * from './defaultRuleGroupProcessorPrisma';\nexport * from './defaultRuleGroupProcessorSequelize';\nexport * from './defaultRuleGroupProcessorSpEL';\nexport * from './defaultRuleGroupProcessorSQL';\nexport * from './defaultRuleProcessorDrizzle';\nexport * from './defaultRuleProcessorElasticSearch';\nexport * from './defaultRuleProcessorJSONata';\nexport * from './defaultRuleProcessorJsonLogic';\nexport * from './defaultRuleProcessorLDAP';\nexport * from './defaultRuleProcessorMongoDBQuery';\nexport * from './defaultRuleProcessorNL';\nexport * from './defaultRuleProcessorParameterized';\nexport * from './defaultRuleProcessorPrisma';\nexport * from './defaultRuleProcessorSequelize';\nexport * from './defaultRuleProcessorSQL';\nexport * from './defaultValueProcessorNL';\nexport * from './formatQuery';\nexport * from './utils';\nexport {\n defaultRuleProcessorCEL,\n defaultRuleProcessorMongoDB,\n defaultRuleProcessorSpEL,\n defaultValueProcessorByRule,\n};\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorCELByRule: RuleProcessor = defaultRuleProcessorCEL;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultValueProcessorMongoDBByRule: RuleProcessor = defaultRuleProcessorMongoDB;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorSpELByRule: RuleProcessor = defaultRuleProcessorSpEL;\n","import type { Path, RuleGroupTypeAny, RuleType } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Return type for {@link findPath}.\n */\nexport type FindPathReturnType = RuleGroupTypeAny | RuleType | null;\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * at the given path within a query.\n */\nexport const findPath = (path: Path, query: RuleGroupTypeAny): FindPathReturnType => {\n let target: FindPathReturnType = query;\n let level = 0;\n while (level < path.length && target && isRuleGroup(target)) {\n const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n target = typeof t === 'string' ? null : t;\n level++;\n }\n\n return level < path.length ? null : target;\n};\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const findID = (id: string, query: RuleGroupTypeAny): FindPathReturnType => {\n if (query.id === id) {\n return query;\n }\n\n for (const rule of query.rules) {\n if (typeof rule === 'string') continue;\n if (rule.id === id) {\n return rule;\n } else if (isRuleGroup(rule)) {\n const subRule = findID(id, rule);\n if (subRule) {\n return subRule;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Returns the {@link Path} of the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const getPathOfID = (id: string, query: RuleGroupTypeAny): Path | null => {\n if (query.id === id) return [];\n\n const idx = query.rules.findIndex(r => !(typeof r === 'string') && r.id === id);\n\n if (idx >= 0) {\n return [idx];\n }\n\n for (const [i, r] of Object.entries(query.rules)) {\n if (isRuleGroup(r)) {\n const subPath = getPathOfID(id, r);\n if (Array.isArray(subPath)) {\n return [Number.parseInt(i), ...subPath];\n }\n }\n }\n\n return null;\n};\n\n/**\n * Truncates the last element of an array and returns the result as a new array.\n */\nexport const getParentPath = (path: Path): Path => path.slice(0, -1);\n\n/**\n * Determines if two paths (each `Path`) are equivalent.\n */\nexport const pathsAreEqual = (path1: Path, path2: Path): boolean =>\n path1.length === path2.length && path1.every((val, idx) => val === path2[idx]);\n\n/**\n * Determines if the first path is an ancestor of the second path. The first path must\n * be shorter and exactly match the second path up through the length of the first path.\n */\nexport const isAncestor = (maybeAncestor: Path, path: Path): boolean =>\n maybeAncestor.length < path.length &&\n new RegExp(`^${maybeAncestor.join('-')}`).test(path.join('-'));\n\n/**\n * Finds the deepest/longest path that two paths have in common.\n */\nexport const getCommonAncestorPath = (path1: Path, path2: Path): Path => {\n const commonAncestorPath: Path = [];\n const parentPath1 = getParentPath(path1);\n const parentPath2 = getParentPath(path2);\n let i = 0;\n\n while (i < parentPath1.length && i < parentPath2.length && parentPath1[i] === parentPath2[i]) {\n commonAncestorPath.push(parentPath2[i]);\n i++;\n }\n\n return commonAncestorPath;\n};\n\n/**\n * Determines if the rule or group at the specified path is either disabled itself\n * or disabled by an ancestor group.\n */\nexport const pathIsDisabled = (path: Path, query: RuleGroupTypeAny): boolean => {\n let disabled = !!query.disabled;\n let target: RuleType | RuleGroupTypeAny = query;\n let level = 0;\n while (level < path.length && !disabled && isRuleGroup(target)) {\n const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n if (isPojo(t) && (isRuleGroup(t) || ('field' in t && !!t.field))) {\n disabled = !!t.disabled;\n target = t;\n }\n level++;\n }\n return disabled;\n};\n","import type { AccessibleDescriptionGenerator as ADG } from '../types';\nimport { pathsAreEqual } from './pathUtils';\n\nexport const generateAccessibleDescription: ADG = params =>\n pathsAreEqual([], params.path) ? `Query builder` : `Rule group at path ${params.path.join('-')}`;\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import { defaultMatchModes } from '../defaults';\nimport type {\n FlexibleOption,\n FullField,\n GetOptionIdentifierType,\n MatchMode,\n MatchModeOptions,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n matchModes: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the match modes array for the given\n * field. If the field definition does not define a `matchModes`\n * property, the `getMatchModes` prop is used. Returns\n * `FullOption<MatchMode>[]` of all match modes by default.\n */\nexport const getMatchModesUtil = <F extends FullField>(\n fieldData: F,\n getMatchModes?: (\n field: GetOptionIdentifierType<F>,\n misc: { fieldData: F }\n ) => boolean | MatchMode[] | FlexibleOption<MatchMode>[]\n): MatchModeOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : /* istanbul ignore next */ dummyFD;\n\n let matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[] = fd.matchModes ?? false;\n\n if (!matchModes && getMatchModes) {\n matchModes = getMatchModes(fd.value as GetOptionIdentifierType<F>, {\n fieldData: fd as F,\n });\n }\n\n if (matchModes === true) {\n return defaultMatchModes;\n } else if (matchModes === false) {\n return [];\n }\n\n if (isFlexibleOptionArray(matchModes)) {\n return toFullOptionList(matchModes) as MatchModeOptions;\n }\n\n return (matchModes?.map(\n mm =>\n defaultMatchModes.find(dmm => dmm.value === lc(mm)) ?? {\n name: mm,\n value: mm,\n label: mm,\n }\n ) ?? []) as MatchModeOptions;\n};\n","import { standardClassnames } from '../defaults';\nimport type { ValidationResult } from '../types';\n\n/**\n * Gets the standard classname for valid or invalid components\n * based on the given validation result.\n */\nexport const getValidationClassNames = (\n validationResult: boolean | ValidationResult\n): '' | (typeof standardClassnames)['valid'] | (typeof standardClassnames)['invalid'] => {\n const valid =\n typeof validationResult === 'boolean'\n ? validationResult\n : typeof validationResult === 'object' && validationResult !== null\n ? validationResult.valid\n : null;\n return typeof valid === 'boolean'\n ? valid\n ? standardClassnames.valid\n : standardClassnames.invalid\n : '';\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import { objectEntries, objectKeys } from '@react-querybuilder/core';\nimport { produce } from 'immer';\n\n/**\n * Merges any number of partial translations into a single definition.\n */\nexport const mergeAnyTranslations = (\n base: Record<string, Record<string, unknown>>,\n ...otherTranslations: (Record<string, Record<string, unknown>> | undefined)[]\n): Record<string, Record<string, unknown>> =>\n produce(base, draft => {\n for (const translations of otherTranslations) {\n // istanbul ignore else\n if (translations) {\n for (const t of objectKeys(translations)) {\n if (draft[t]) {\n Object.assign(draft[t], translations[t]);\n } else {\n Object.assign(draft, { [t]: translations[t] });\n }\n }\n }\n }\n });\n\nexport const mergeAnyTranslation = (\n el: string,\n keyPropContextMap: Record<string, [unknown, unknown]>,\n defaults?: Record<string, Record<string, unknown>>\n): Record<string, Record<string, unknown>> | undefined => {\n const finalKeys = objectEntries(keyPropContextMap)\n .map(([key, [pT, cT]]) => [key, pT ?? cT ?? defaults?.[el]?.[key]])\n .filter(k => !!k[1]);\n if (finalKeys.length > 0 || defaults) {\n const defaultProperties = defaults?.[el] ?? {};\n const finalObject = Object.assign({}, defaultProperties, Object.fromEntries(finalKeys));\n return { [el]: finalObject };\n }\n return undefined;\n};\n","import type { Classnames } from '../types';\nimport { clsx } from './clsx';\n\ntype MergeClassnamesParams = (Partial<Classnames> | undefined)[];\n\nconst joinClassnamesByName = (name: keyof Classnames, args: MergeClassnamesParams) =>\n clsx(args.map(c => clsx(c?.[name])));\n\n/**\n * Merges a list of partial {@link Classnames} definitions into a single definition.\n */\nexport const mergeClassnames = (...args: MergeClassnamesParams): Classnames => ({\n queryBuilder: joinClassnamesByName('queryBuilder', args),\n ruleGroup: joinClassnamesByName('ruleGroup', args),\n header: joinClassnamesByName('header', args),\n body: joinClassnamesByName('body', args),\n combinators: joinClassnamesByName('combinators', args),\n addRule: joinClassnamesByName('addRule', args),\n addGroup: joinClassnamesByName('addGroup', args),\n cloneRule: joinClassnamesByName('cloneRule', args),\n cloneGroup: joinClassnamesByName('cloneGroup', args),\n removeGroup: joinClassnamesByName('removeGroup', args),\n rule: joinClassnamesByName('rule', args),\n fields: joinClassnamesByName('fields', args),\n operators: joinClassnamesByName('operators', args),\n value: joinClassnamesByName('value', args),\n removeRule: joinClassnamesByName('removeRule', args),\n notToggle: joinClassnamesByName('notToggle', args),\n shiftActions: joinClassnamesByName('shiftActions', args),\n dragHandle: joinClassnamesByName('dragHandle', args),\n lockRule: joinClassnamesByName('lockRule', args),\n lockGroup: joinClassnamesByName('lockGroup', args),\n muteRule: joinClassnamesByName('muteRule', args),\n muteGroup: joinClassnamesByName('muteGroup', args),\n muted: joinClassnamesByName('muted', args),\n valueSource: joinClassnamesByName('valueSource', args),\n actionElement: joinClassnamesByName('actionElement', args),\n valueSelector: joinClassnamesByName('valueSelector', args),\n betweenRules: joinClassnamesByName('betweenRules', args),\n valid: joinClassnamesByName('valid', args),\n invalid: joinClassnamesByName('invalid', args),\n dndDragging: joinClassnamesByName('dndDragging', args),\n dndOver: joinClassnamesByName('dndOver', args),\n dndCopy: joinClassnamesByName('dndCopy', args),\n dndGroup: joinClassnamesByName('dndGroup', args),\n dndDropNotAllowed: joinClassnamesByName('dndDropNotAllowed', args),\n disabled: joinClassnamesByName('disabled', args),\n valueListItem: joinClassnamesByName('valueListItem', args),\n matchMode: joinClassnamesByName('matchMode', args),\n matchThreshold: joinClassnamesByName('matchThreshold', args),\n branches: joinClassnamesByName('branches', args),\n hasSubQuery: joinClassnamesByName('hasSubQuery', args),\n});\n","import type { QueryBuilderFlags } from 'react-querybuilder';\nimport { queryBuilderFlagDefaults } from '../defaults';\nimport { objectEntries } from './objectUtils';\n\nconst preferPropDefaultTrue = (prop?: boolean, context?: boolean) =>\n prop === false ? false : prop ? true : !(context === false);\n\nconst preferPropDefaultFalse = (prop?: boolean, context?: boolean) =>\n prop ? true : prop === false ? false : !!context;\n\n/**\n * For given default, prop, and context values, return the first provided of prop,\n * context, and default, in that order.\n */\nexport const preferProp = (\n def: boolean,\n prop?: boolean,\n context?: boolean,\n doNotFinalize?: boolean\n): boolean =>\n !doNotFinalize\n ? def\n ? preferPropDefaultTrue(prop, context)\n : preferPropDefaultFalse(prop, context)\n : (prop ?? (context as boolean));\n\n/**\n * For given default, prop, and context values, return the first provided of prop,\n * context, and default, in that order.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const preferAnyProp = (def?: any, prop?: any, context?: any): any =>\n prop !== undefined && prop != null\n ? prop\n : context !== undefined && context != null\n ? context\n : def;\n\n/**\n * For a given set of defaults, props, and context values, return the first provided of prop,\n * context, and default—in that order—for each property in the defaults object.\n */\nexport const preferFlagProps = (\n props: QueryBuilderFlags = {},\n contextVals: QueryBuilderFlags = {},\n finalize?: boolean\n): QueryBuilderFlags =>\n objectEntries(queryBuilderFlagDefaults).reduce<QueryBuilderFlags>((acc, [key, def]) => {\n acc[key] = preferProp(def, props[key], contextVals[key], !finalize);\n return acc;\n }, {});\n","import { produce } from 'immer';\nimport type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType =>\n produce(rule, draft => {\n if (!draft.id) {\n draft.id = idGenerator();\n }\n });\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG =>\n produce(queryObject, draft => {\n if (!draft.id) {\n draft.id = idGenerator();\n }\n draft.rules = draft.rules.map(r =>\n typeof r === 'string'\n ? r\n : isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator })\n ) as RuleGroupArray | RuleGroupICArray;\n });\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n","import type { SetRequired } from 'type-fest';\nimport type { RuleGroupTypeAny, RuleType } from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Options object for {@link regenerateID}/{@link regenerateIDs}.\n */\nexport interface RegenerateIdOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Generates a new `id` property for a rule.\n */\nexport const regenerateID = <R extends RuleType>(\n rule: R,\n { idGenerator = generateID }: RegenerateIdOptions = {}\n): SetRequired<R, 'id'> => structuredClone({ ...rule, id: idGenerator() } as SetRequired<R, 'id'>);\n\n/**\n * Recursively generates new `id` properties for a rule group and all its rules and subgroups.\n */\nexport const regenerateIDs = <RG>(\n subject: RG,\n { idGenerator = generateID }: RegenerateIdOptions = {}\n): RG & { id: string } => {\n if (!isPojo(subject)) return subject as RG & { id: string };\n\n if (!isRuleGroup(subject)) {\n return structuredClone({\n ...subject,\n id: idGenerator(),\n }) as RG & { id: string };\n }\n\n const newGroup = { ...subject, id: idGenerator() } as RuleGroupTypeAny;\n\n // istanbul ignore else\n if (Array.isArray(newGroup.rules)) {\n // oxlint-disable-next-line no-explicit-any\n (newGroup.rules as any) = subject.rules.map((r: unknown) =>\n typeof r === 'string'\n ? r\n : isRuleGroup(r)\n ? regenerateIDs(r, { idGenerator })\n : regenerateID(r as RuleType, { idGenerator })\n );\n }\n\n return newGroup as unknown as RG & { id: string };\n};\n","import { produce } from 'immer';\nimport { defaultCombinators } from '../defaults';\nimport type {\n MatchModeOptions,\n OptionList,\n Path,\n RuleGroupTypeAny,\n RuleType,\n UpdateableProperties,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { generateID } from './generateID';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { getFirstOption, getOption } from './optGroupUtils';\nimport {\n findID,\n findPath,\n getCommonAncestorPath,\n getParentPath,\n getPathOfID,\n pathsAreEqual,\n} from './pathUtils';\nimport { prepareRuleOrGroup } from './prepareQueryObjects';\nimport { regenerateIDs } from './regenerateIDs';\n\n/**\n * Options for {@link add}.\n *\n * @group Query Tools\n */\nexport interface AddOptions {\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then the first combinator in this list will be inserted\n * before the new rule/group if the parent group is not empty. This option\n * is overridden by `combinatorPreceding`.\n */\n combinators?: OptionList;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted before the new rule/group\n * if the parent group is not empty. This option will supersede `combinators`.\n */\n combinatorPreceding?: string;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Adds a rule or group to a query.\n * @returns The new query with the rule or group added.\n *\n * @group Query Tools\n */\nexport const add = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The rule or group to add. */\n ruleOrGroup: RG | RuleType,\n /** Path or ID of the group to add to. */\n parentPathOrID: Path | string,\n /** Options. */\n {\n combinators = defaultCombinators,\n combinatorPreceding,\n idGenerator = generateID,\n }: AddOptions = {}\n): RG =>\n produce(query, draft => {\n const parent = Array.isArray(parentPathOrID)\n ? findPath(parentPathOrID, draft)\n : findID(parentPathOrID, draft);\n\n if (!parent || !isRuleGroup(parent)) return;\n\n if (isRuleGroupTypeIC(parent) && parent.rules.length > 0) {\n const prevCombinator = parent.rules.at(-2);\n parent.rules.push(\n // @ts-expect-error This is technically a type violation until the next push\n // to the rules array, but that happens immediately and unconditionally so\n // there's no significant risk.\n combinatorPreceding ??\n (typeof prevCombinator === 'string' ? prevCombinator : getFirstOption(combinators))\n );\n }\n // `as RuleType` is only here to avoid the ambiguity with `RuleGroupTypeAny`\n parent.rules.push(prepareRuleOrGroup(ruleOrGroup, { idGenerator }) as RuleType);\n });\n\n/**\n * Options for {@link update}.\n *\n * @group Query Tools\n */\nexport interface UpdateOptions {\n /**\n * When updating the `field` of a rule, the rule's `operator`, `value`, and `valueSource`\n * will be reset to their respective defaults. Defaults to `true`.\n */\n resetOnFieldChange?: boolean;\n /**\n * When updating the `operator` of a rule, the rule's `value` and `valueSource`\n * will be reset to their respective defaults. Defaults to `false`.\n */\n resetOnOperatorChange?: boolean;\n /**\n * Determines the default operator name for a given field.\n */\n getRuleDefaultOperator?: (field: string) => string;\n /**\n * Determines the valid value sources for a given field and operator.\n */\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n /**\n * Gets the default value for a given rule, in case the value needs to be reset.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n getRuleDefaultValue?: (rule: RuleType) => any;\n /**\n * Determines the valid match modes for a given field.\n */\n getMatchModes?: (field: string) => MatchModeOptions;\n}\n/**\n * Updates a property of a rule or group within a query.\n * @returns The new query with the rule or group property updated.\n *\n * @group Query Tools\n */\nexport const update = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The name of the property to update. */\n prop: UpdateableProperties,\n /** The new value of the property. */\n // oxlint-disable-next-line typescript/no-explicit-any\n value: any,\n /** The path or ID of the rule or group to update. */\n pathOrID: Path | string,\n /** Options. */\n {\n resetOnFieldChange = true,\n resetOnOperatorChange = false,\n getRuleDefaultOperator = () => '=',\n getValueSources = () => ['value'],\n getRuleDefaultValue = () => '',\n getMatchModes = () => [],\n }: UpdateOptions = {}\n): RG =>\n produce(query, draft => {\n const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, draft);\n\n // Ignore invalid paths/ids\n if (!path) return;\n\n // Independent combinators\n if (prop === 'combinator' && !isRuleGroupType(draft)) {\n const parentRules = (findPath(getParentPath(path), draft) as RG).rules;\n // Only update an independent combinator if it occupies an odd index\n if (path.at(-1)! % 2 === 1) {\n parentRules[path.at(-1)!] = value;\n }\n return;\n }\n\n const ruleOrGroup = findPath(path, draft);\n\n // Ignore invalid paths\n if (!ruleOrGroup) return;\n\n const isGroup = isRuleGroup(ruleOrGroup);\n\n // Only update if there is actually a change\n // @ts-expect-error prop can refer to rule or group properties\n if (ruleOrGroup[prop] === value) return;\n\n // Handle valueSource updates later\n if (prop !== 'valueSource') {\n // @ts-expect-error prop can refer to rule or group properties\n ruleOrGroup[prop] = value;\n }\n\n // If this is a group, there's no more to do\n if (isGroup) return;\n\n let resetValueSource = false;\n let resetValue = false;\n\n if (prop === 'field') {\n const fromFieldMatchModes = getMatchModes(ruleOrGroup.field);\n const toFieldMatchModes = getMatchModes(value);\n\n if (toFieldMatchModes.length === 0) {\n delete ruleOrGroup.match;\n } else {\n const nextMatchMode =\n ruleOrGroup.match?.mode && getOption(toFieldMatchModes, ruleOrGroup.match.mode)\n ? null\n : getFirstOption(toFieldMatchModes);\n if (nextMatchMode) {\n ruleOrGroup.match = { mode: nextMatchMode, threshold: 1 };\n }\n }\n\n if (fromFieldMatchModes.length > 0 || toFieldMatchModes.length > 0) {\n // Force `resetOnFieldChange` when field is updated FROM or TO one that has match modes\n resetOnFieldChange = true;\n }\n }\n\n // Set default operator, valueSource, and value for field change\n if (resetOnFieldChange && prop === 'field') {\n ruleOrGroup.operator = getRuleDefaultOperator(value);\n resetValueSource = true;\n resetValue = true;\n }\n\n // Set default valueSource and value for operator change\n if (resetOnOperatorChange && prop === 'operator') {\n resetValueSource = true;\n resetValue = true;\n }\n\n const valueSources = getValueSourcesUtil(\n { name: ruleOrGroup.field, value: ruleOrGroup.field, label: '' },\n ruleOrGroup.operator,\n getValueSources\n );\n const defaultValueSource = getFirstOption(valueSources);\n if (\n (resetValueSource &&\n ruleOrGroup.valueSource &&\n defaultValueSource !== ruleOrGroup.valueSource) ||\n (prop === 'valueSource' && value !== ruleOrGroup.valueSource)\n ) {\n // Only reset the value if we're changing the valueSource either\n // 1) from `undefined` to something that is _not_ the default, or\n // 2) from the current (defined) value to something else\n resetValue =\n !!ruleOrGroup.valueSource || (!ruleOrGroup.valueSource && value !== defaultValueSource);\n ruleOrGroup.valueSource = resetValueSource ? defaultValueSource : value;\n }\n\n if (resetValue) {\n // The default value should be a valid field name if defaultValueSource is 'field'\n ruleOrGroup.value = getRuleDefaultValue(ruleOrGroup);\n }\n });\n\n/**\n * Removes a rule or group from a query.\n * @returns The new query with the rule or group removed.\n *\n * @group Query Tools\n */\nexport const remove = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The path or ID of the rule or group to remove. */\n pathOrID: Path | string\n): RG => {\n const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, query);\n\n // Ignore invalid paths/ids\n if (!path) return query;\n\n if (\n // Can't remove the root group\n path.length === 0 ||\n // Can't independently remove independent combinators\n (!isRuleGroupType(query) && !findPath(path, query))\n ) {\n return query;\n }\n\n return produce(query, draft => {\n const index = path.at(-1)!;\n const parent = findPath(getParentPath(path), draft);\n if (parent && isRuleGroup(parent)) {\n if (!isRuleGroupType(parent) && parent.rules.length > 1) {\n const idxStartDelete = index === 0 ? 0 : index - 1;\n parent.rules.splice(idxStartDelete, 2);\n } else {\n parent.rules.splice(index, 1);\n }\n }\n });\n};\n\nconst getNextPath = (\n query: RuleGroupTypeAny,\n currentPath: Path,\n newPathOrShiftDirection: Path | 'up' | 'down'\n): Path => {\n if (Array.isArray(newPathOrShiftDirection)) {\n return newPathOrShiftDirection;\n }\n\n const ic = isRuleGroupTypeIC(query);\n\n if (newPathOrShiftDirection === 'up') {\n if (pathsAreEqual(currentPath, [0])) {\n return currentPath;\n } else if (currentPath.at(-1) === 0) {\n const parentPath = getParentPath(currentPath);\n return [...getParentPath(parentPath), Math.max(0, parentPath.at(-1)! - (ic ? 1 : 0))];\n } else {\n const evaluationPath = [\n ...getParentPath(currentPath),\n Math.max(0, currentPath.at(-1)! - (ic ? 2 : 1)),\n ];\n const entityAtTarget = findPath(evaluationPath, query);\n if (isRuleGroup(entityAtTarget)) {\n return [...evaluationPath, entityAtTarget.rules.length];\n } else {\n const targetPath = [\n ...getParentPath(currentPath),\n Math.max(0, currentPath.at(-1)! - (ic ? 3 : 1)),\n ];\n return targetPath;\n }\n }\n } else if (newPathOrShiftDirection === 'down') {\n if (pathsAreEqual([query.rules.length - 1], currentPath)) {\n return currentPath;\n } else if (\n currentPath.at(-1) ===\n (findPath(getParentPath(currentPath), query) as RuleGroupTypeAny).rules.length - 1\n ) {\n const parentPath = getParentPath(currentPath);\n return [...getParentPath(parentPath), parentPath.at(-1)! + 1];\n } else {\n const evaluationPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 2 : 1)];\n const entityToEvaluate = findPath(evaluationPath, query);\n if (isRuleGroup(entityToEvaluate)) {\n return [...evaluationPath, 0];\n } else {\n const targetPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 3 : 2)];\n return targetPath;\n }\n }\n }\n\n return currentPath;\n};\n\n/**\n * Options for {@link move}.\n *\n * @group Query Tools\n */\nexport interface MoveOptions {\n /**\n * When `true`, the source rule/group will not be removed from its original path.\n */\n clone?: boolean;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n * combinators), then the first combinator in this list will be inserted before\n * the rule/group if necessary.\n */\n combinators?: OptionList;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Moves a rule or group from one path to another. In the options parameter, pass\n * `{ clone: true }` to copy instead of move.\n * @returns The new query with the rule or group moved or cloned.\n *\n * @group Query Tools\n */\nexport const move = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** ID or original path of the rule or group to move. */\n oldPathOrID: Path | string,\n /** Path to move the rule or group to, or a shift direction. */\n newPath: Path | 'up' | 'down',\n /** Options. */\n { clone = false, combinators = defaultCombinators, idGenerator = generateID }: MoveOptions = {}\n): RG => {\n const oldPath = Array.isArray(oldPathOrID) ? oldPathOrID : getPathOfID(oldPathOrID, query);\n\n // Ignore invalid paths/ids\n if (!oldPath) return query;\n\n const nextPath = getNextPath(query, oldPath, newPath);\n\n // Don't move to the same location or a path that doesn't exist yet\n if (\n oldPath.length === 0 ||\n pathsAreEqual(oldPath, nextPath) ||\n !findPath(getParentPath(nextPath), query)\n ) {\n return query;\n }\n\n const ruleOrGroupOriginal = findPath(oldPath, query);\n if (!ruleOrGroupOriginal) {\n return query;\n }\n const ruleOrGroup = clone\n ? regenerateIDs(ruleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n : ruleOrGroupOriginal;\n\n return produce(query, draft => {\n const independentCombinators = isRuleGroupTypeIC(draft);\n const parentOfRuleToRemove = findPath(getParentPath(oldPath), draft) as RG;\n const ruleToRemoveIndex = oldPath.at(-1)!;\n const oldPrevCombinator =\n independentCombinators && ruleToRemoveIndex > 0\n ? (parentOfRuleToRemove.rules[ruleToRemoveIndex - 1] as string)\n : null;\n const oldNextCombinator =\n independentCombinators && ruleToRemoveIndex < parentOfRuleToRemove.rules.length - 1\n ? (parentOfRuleToRemove.rules[ruleToRemoveIndex + 1] as string)\n : null;\n\n // Remove the source item if not cloning\n if (!clone) {\n const idxStartDelete = independentCombinators\n ? Math.max(0, ruleToRemoveIndex - 1)\n : ruleToRemoveIndex;\n const deleteLength = independentCombinators ? 2 : 1;\n parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n }\n\n const newNewPath = [...nextPath];\n const commonAncestorPath = getCommonAncestorPath(oldPath, nextPath);\n if (\n !clone &&\n oldPath.length === commonAncestorPath.length + 1 &&\n nextPath[commonAncestorPath.length] > oldPath[commonAncestorPath.length]\n ) {\n // Getting here means there will be a shift of paths upward at the common\n // ancestor level because the object at `oldPath` will be spliced out. The\n // real new path should therefore be one or two higher than `newPathCalc`.\n newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n }\n const newNewParentPath = getParentPath(newNewPath);\n const parentToInsertInto = findPath(newNewParentPath, draft) as RG;\n const newIndex = newNewPath.at(-1)!;\n\n /**\n * This function 1) glosses over the need for type assertions to splice directly\n * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n const insertRuleOrGroup = (...args: any[]) =>\n parentToInsertInto.rules.splice(newIndex, 0, ...args);\n\n // Insert the source item at the target path\n if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n insertRuleOrGroup(ruleOrGroup);\n } else {\n if (newIndex === 0) {\n if (ruleToRemoveIndex === 0 && oldNextCombinator) {\n insertRuleOrGroup(ruleOrGroup, oldNextCombinator);\n } else {\n const newNextCombinator =\n parentToInsertInto.rules[1] ?? oldPrevCombinator ?? getFirstOption(combinators);\n insertRuleOrGroup(ruleOrGroup, newNextCombinator);\n }\n } else {\n if (oldPrevCombinator) {\n insertRuleOrGroup(oldPrevCombinator, ruleOrGroup);\n } else {\n const newPrevCombinator =\n parentToInsertInto.rules[newIndex - 2] ??\n oldNextCombinator ??\n getFirstOption(combinators);\n insertRuleOrGroup(newPrevCombinator, ruleOrGroup);\n }\n }\n }\n });\n};\n\n/**\n * Options for {@link insert}.\n *\n * @group Query Tools\n */\nexport interface InsertOptions {\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then the first combinator in this list will be inserted\n * before the new rule/group if the parent group is not empty. This option\n * is overridden by `combinatorPreceding`.\n */\n combinators?: OptionList;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted before the new rule/group\n * if the parent group is not empty and the new rule/group is not the first in the\n * group (`path.at(-1) > 0`). This option will supersede `combinators`.\n */\n combinatorPreceding?: string;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n * combinators), then this combinator will be inserted after the new rule/group\n * if the parent group is not empty and the new rule/group is the first in the\n * group (`path.at(-1) === 0`). This option will supersede `combinators`.\n */\n combinatorSucceeding?: string;\n /**\n * ID generator.\n *\n * @default generateID\n */\n idGenerator?: () => string;\n /**\n * When `true`, the new rule/group will replace the rule/group at `path`.\n */\n replace?: boolean;\n}\n/**\n * Inserts a rule or group into a query.\n * @returns The new query with the rule or group inserted.\n *\n * @group Query Tools\n */\nexport const insert = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** The rule or group to insert. */\n ruleOrGroup: RG | RuleType,\n /** Path at which to insert the rule or group. */\n path: number[],\n /** Options. */\n {\n combinators = defaultCombinators,\n combinatorPreceding,\n combinatorSucceeding,\n idGenerator = generateID,\n replace = false,\n }: InsertOptions = {}\n): RG =>\n produce(query, draft => {\n const parentToInsertInto = findPath(getParentPath(path), draft) as RG;\n if (!parentToInsertInto || !isRuleGroup(parentToInsertInto)) return;\n\n const rorg = regenerateIDs(ruleOrGroup as RuleGroupTypeAny, { idGenerator });\n const independentCombinators = isRuleGroupTypeIC(draft);\n const newIndex = path.at(-1)!;\n\n /**\n * This function 1) glosses over the need for type assertions to splice directly\n * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n */\n // oxlint-disable-next-line typescript/no-explicit-any\n const insertRuleOrGroup = (idx: number, ...args: any[]) =>\n parentToInsertInto.rules.splice(idx, replace ? args.length : 0, ...args);\n\n // Insert the source item at the target path\n if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n insertRuleOrGroup(newIndex, rorg);\n } else if (replace && independentCombinators) {\n insertRuleOrGroup(newIndex + (newIndex % 2), rorg);\n } else {\n if (newIndex === 0) {\n if (rorg.path?.at(-1) === 0 && combinatorSucceeding) {\n insertRuleOrGroup(newIndex, rorg, combinatorSucceeding);\n } else {\n const newNextCombinator =\n parentToInsertInto.rules[1] ?? combinatorPreceding ?? getFirstOption(combinators);\n insertRuleOrGroup(newIndex, rorg, newNextCombinator);\n }\n } else {\n const normalizedNewIndex = newIndex % 2 === 0 ? newIndex - 1 : newIndex;\n if (combinatorPreceding) {\n insertRuleOrGroup(normalizedNewIndex, combinatorPreceding, rorg);\n } else {\n const newPrevCombinator =\n parentToInsertInto.rules[normalizedNewIndex - 2] ??\n combinatorSucceeding ??\n getFirstOption(combinators);\n insertRuleOrGroup(normalizedNewIndex, newPrevCombinator, rorg);\n }\n }\n }\n });\n\n/**\n * Options for {@link group}.\n *\n * @group Query Tools\n */\nexport interface GroupOptions {\n /**\n * When `true`, the source rule/group will not be removed from its original path.\n */\n clone?: boolean;\n /**\n * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n * combinators), then the first combinator in this list will be inserted between\n * the two rules/groups.\n */\n combinators?: OptionList;\n /**\n * ID generator.\n */\n idGenerator?: () => string;\n}\n/**\n * Creates a new group at a target path with its `rules` array containing the current\n * objects at the target path and the source path. In the options parameter, pass\n * `{ clone: true }` to copy the source rule/group instead of move.\n *\n * @returns The new query with the rules or groups grouped.\n *\n * @group Query Tools\n */\nexport const group = <RG extends RuleGroupTypeAny>(\n /** The query to update. */\n query: RG,\n /** Path of the rule/group to move or clone. */\n sourcePathOrID: Path | string,\n /** Path of the target rule/group, which will become the path of the new group. */\n targetPathOrID: Path | string,\n /** Options. */\n { clone = false, combinators = defaultCombinators, idGenerator = generateID }: GroupOptions = {}\n): RG => {\n const sourcePath = Array.isArray(sourcePathOrID)\n ? sourcePathOrID\n : getPathOfID(sourcePathOrID, query);\n const targetPath = Array.isArray(targetPathOrID)\n ? targetPathOrID\n : getPathOfID(targetPathOrID, query);\n\n // Ignore invalid paths/ids\n if (!sourcePath || !targetPath) return query;\n\n const nextPath = getNextPath(query, sourcePath, targetPath);\n\n // Don't move to the same location or a path that doesn't exist yet\n if (\n sourcePath.length === 0 ||\n pathsAreEqual(sourcePath, nextPath) ||\n !findPath(getParentPath(nextPath), query)\n ) {\n return query;\n }\n\n const sourceRuleOrGroupOriginal = findPath(sourcePath, query);\n const targetRuleOrGroup = findPath(targetPath, query);\n if (!sourceRuleOrGroupOriginal || !targetRuleOrGroup) {\n return query;\n }\n const sourceRuleOrGroup = clone\n ? regenerateIDs(sourceRuleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n : sourceRuleOrGroupOriginal;\n\n return produce(query, draft => {\n const independentCombinators = isRuleGroupTypeIC(draft);\n const parentOfRuleToRemove = findPath(getParentPath(sourcePath), draft) as RG;\n const ruleToRemoveIndex = sourcePath.at(-1)!;\n\n // Remove the source item if not cloning\n if (!clone) {\n const idxStartDelete = independentCombinators\n ? Math.max(0, ruleToRemoveIndex - 1)\n : ruleToRemoveIndex;\n const deleteLength = independentCombinators ? 2 : 1;\n parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n }\n\n const newNewPath = [...nextPath];\n const commonAncestorPath = getCommonAncestorPath(sourcePath, nextPath);\n if (\n !clone &&\n sourcePath.length === commonAncestorPath.length + 1 &&\n nextPath[commonAncestorPath.length] > sourcePath[commonAncestorPath.length]\n ) {\n // Getting here means there will be a shift of paths upward at the common\n // ancestor level because the object at `oldPath` will be spliced out. The\n // real new path should therefore be one or two higher than `newPathCalc`.\n newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n }\n const newNewParentPath = getParentPath(newNewPath);\n const parentOfTargetPath = findPath(newNewParentPath, draft) as RG;\n const targetPathIndex = newNewPath.at(-1)!;\n\n // Convert the target path to a group and insert the source and target items as children\n parentOfTargetPath.rules.splice(\n targetPathIndex,\n 1,\n prepareRuleOrGroup(\n (independentCombinators\n ? { rules: [targetRuleOrGroup, getFirstOption(combinators), sourceRuleOrGroup] }\n : {\n combinator: getFirstOption(combinators),\n rules: [targetRuleOrGroup, sourceRuleOrGroup],\n // oxlint-disable-next-line typescript/no-explicit-any\n }) as any,\n { idGenerator }\n // oxlint-disable-next-line typescript/no-explicit-any\n ) as any\n );\n });\n};\n"],"mappings":"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"}