/** Advanced filter query tree: operators, value kinds, groups, serialize. */ export type FilterFieldType = 'text' | 'number' | 'select' | 'multiselect' | 'date' | 'boolean'; export type FilterOperator = 'eq' | 'neq' | 'in' | 'nin' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'between' | 'is_empty' | 'is_not_empty' | 'exists' | 'not_exists'; export type AdvancedFilterValue = string | number | boolean | string[] | [number, number] | [string, string] | null | undefined; export type FilterValueKind = 'none' | 'text' | 'number' | 'date' | 'boolean' | 'select' | 'multiselect' | 'range-number' | 'range-date'; export type FilterCombinator = 'and' | 'or'; export interface FilterFieldOption { value: string; label: string; } export interface FilterFieldDef { id: string; label: string; type: FilterFieldType; operators?: FilterOperator[]; options?: FilterFieldOption[]; } export interface AdvancedFilterRule { id: string; type: 'rule'; field: string; op: FilterOperator; value: AdvancedFilterValue; } export interface AdvancedFilterGroup { id: string; type: 'group'; combinator: FilterCombinator; rules: AdvancedFilterNode[]; } export type AdvancedFilterNode = AdvancedFilterRule | AdvancedFilterGroup; /** @deprecated Flat clause — prefer AdvancedFilterRule inside a group */ export type AdvancedFilterClause = { id: string; field: string; op: FilterOperator; value: AdvancedFilterValue; }; export declare const FILTER_OPERATORS: FilterOperator[]; export declare const OP_LABELS: Record; export declare const DEFAULT_OPS: Record; export declare function isFilterOperator(v: string): v is FilterOperator; export declare function operatorsForField(field: FilterFieldDef): FilterOperator[]; export declare function resolveValueKind(field: FilterFieldDef, op: FilterOperator): FilterValueKind; export declare function emptyFilterGroup(combinator?: FilterCombinator): AdvancedFilterGroup; export declare function emptyFilterRule(fieldId?: string, op?: FilterOperator): AdvancedFilterRule; export declare function isGroup(node: AdvancedFilterNode): node is AdvancedFilterGroup; export declare function isRule(node: AdvancedFilterNode): node is AdvancedFilterRule; /** Flatten rules (ignore group structure) — useful for chips / legacy. */ export declare function flattenRules(node: AdvancedFilterNode): AdvancedFilterRule[]; export declare function countRules(node: AdvancedFilterNode): number; /** Convert legacy flat clauses → root AND group */ export declare function clausesToGroup(clauses: AdvancedFilterClause[]): AdvancedFilterGroup; export declare function groupToClauses(group: AdvancedFilterGroup): AdvancedFilterClause[]; export declare function formatRuleLabel(rule: AdvancedFilterRule, fields?: FilterFieldDef[]): string; export declare function encodeFilterValue(value: AdvancedFilterValue): string; export declare function decodeFilterValue(op: FilterOperator, raw: string): AdvancedFilterValue; /** * Serialize group tree. * Flat AND of rules → legacy `field:op:value;field:op:value` * Nested → `and(rule,or(rule,rule),rule)` */ export declare function serializeAdvancedGroup(group: AdvancedFilterGroup): string | null; /** Parse `a` param — supports legacy `;` and nested `and(...)` / `or(...)`. */ export declare function parseAdvancedGroup(raw: string | null): AdvancedFilterGroup; export declare function matchRuleValue(raw: string | number | string[] | boolean | undefined | null, op: FilterOperator, value: AdvancedFilterValue): boolean; export declare function matchGroup(group: AdvancedFilterGroup, getField: (fieldId: string) => string | number | string[] | boolean | undefined | null): boolean; /** Normalize CatalogFilterState.advanced which may be clauses[] or a group */ export declare function asFilterGroup(advanced: AdvancedFilterGroup | AdvancedFilterClause[] | undefined): AdvancedFilterGroup;