import type { OnyxInput, OnyxKey } from './types';
type EmptyObject = Record<string, never>;
type EmptyValue = EmptyObject | null | undefined;
/**
 * A tuple where the first value is the path to the nested object that contains the
 * internal `ONYX_INTERNALS__REPLACE_OBJECT_MARK` flag, and the second value is the data we want to replace
 * in that path.
 *
 * This tuple will be used in SQLiteProvider to replace the nested object using `JSON_REPLACE`.
 * */
type FastMergeReplaceNullPatch = [string[], unknown];
type FastMergeOptions = {
    /** If true, null object values will be removed. */
    shouldRemoveNestedNulls?: boolean;
    /**
     * If set to "mark", we will mark objects that are set to null instead of simply removing them,
     * so that we can batch changes together, without losing information about the object removal.
     * If set to "replace", we will completely replace the marked objects with the new value instead of merging them.
     */
    objectRemovalMode?: 'mark' | 'replace' | 'none';
};
type FastMergeMetadata = {
    /** The list of tuples that will be used in SQLiteProvider to replace the nested objects using `JSON_REPLACE`. */
    replaceNullPatches: FastMergeReplaceNullPatch[];
};
type FastMergeResult<TValue> = {
    /** The result of the merge. */
    result: TValue;
    /** The list of tuples that will be used in SQLiteProvider to replace the nested objects using `JSON_REPLACE`. */
    replaceNullPatches: FastMergeReplaceNullPatch[];
};
/**
 * Merges two objects and removes null values if "shouldRemoveNestedNulls" is set to true
 *
 * We generally want to remove null values from objects written to disk and cache, because it decreases the amount of data stored in memory and on disk.
 */
declare function fastMerge<TValue>(target: TValue, source: TValue, options?: FastMergeOptions, metadata?: FastMergeMetadata, basePath?: string[]): FastMergeResult<TValue>;
/** Checks whether the given object is an object and not null/undefined. */
declare function isEmptyObject<T>(obj: T | EmptyValue): obj is EmptyValue;
/** Deep removes the nested null values from the given value. Returns the original reference if no nulls were found. */
declare function removeNestedNullValues<TValue extends OnyxInput<OnyxKey> | null>(value: TValue): TValue;
/** Formats the action name by uppercasing and adding the key if provided. */
declare function formatActionName(method: string, key?: OnyxKey): string;
/** validate that the update and the existing value are compatible */
declare function checkCompatibilityWithExistingValue(value: unknown, existingValue: unknown): {
    isCompatible: boolean;
    existingValueType?: string;
    newValueType?: string;
    isEmptyArrayCoercion?: boolean;
};
/**
 * Picks entries from an object based on a condition.
 *
 * @param obj - The object to pick entries from.
 * @param condition - The condition to determine which entries to pick.
 * @returns The object containing only the picked entries.
 */
declare function pick<TValue>(obj: Record<string, TValue>, condition: string | string[] | ((entry: [string, TValue]) => boolean)): Record<string, TValue>;
/**
 * Omits entries from an object based on a condition.
 *
 * @param obj - The object to omit entries from.
 * @param condition - The condition to determine which entries to omit.
 * @returns The object containing only the remaining entries after omission.
 */
declare function omit<TValue>(obj: Record<string, TValue>, condition: string | string[] | ((entry: [string, TValue]) => boolean)): Record<string, TValue>;
declare const _default: {
    fastMerge: typeof fastMerge;
    isEmptyObject: typeof isEmptyObject;
    formatActionName: typeof formatActionName;
    removeNestedNullValues: typeof removeNestedNullValues;
    checkCompatibilityWithExistingValue: typeof checkCompatibilityWithExistingValue;
    pick: typeof pick;
    omit: typeof omit;
    ONYX_INTERNALS__REPLACE_OBJECT_MARK: string;
};
export default _default;
export type { FastMergeResult, FastMergeReplaceNullPatch, FastMergeOptions };
