// Type definitions
type GetterDefObj = {
    [key: PropertyKey]: () => any;
};
type LazyGetterStats = {
    initialized?: Set<PropertyKey> | undefined;
};
type ConstantsObjectOptions = {
    getters?: GetterDefObj | undefined;
    internals?: object | undefined;
    mixin?: object | undefined;
};
type Remap<T> = {
    [K in keyof T]: T[K];
} extends infer O ? {
    [K in keyof O]: O[K];
} : never;
// Type for generic property bag.
type PropertyBag = {
    [key: PropertyKey]: any;
};
// Type for generic sorted object entries.
type SortedObject<T> = {
    [key: PropertyKey]: T;
};
export type { GetterDefObj, LazyGetterStats, ConstantsObjectOptions, Remap };
/**
 * Create a lazy getter function that memoizes its result.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function createLazyGetter<T>(name: PropertyKey, getter: () => T, stats?: LazyGetterStats): () => T;
/**
 * Create a frozen constants object with lazy getters and internal properties.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function createConstantsObject(props: object, options_?: ConstantsObjectOptions): Readonly<object>;
/**
 * Define a getter property on an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function defineGetter<T>(object: object, propKey: PropertyKey, getter: () => T): object;
/**
 * Define a lazy getter property on an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function defineLazyGetter<T>(object: object, propKey: PropertyKey, getter: () => T, stats?: LazyGetterStats): object;
/**
 * Define multiple lazy getter properties on an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function defineLazyGetters(object: object, getterDefObj: GetterDefObj | undefined, stats?: LazyGetterStats): object;
/**
 * Compare two entry arrays by their keys for sorting.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function entryKeyComparator(a: [PropertyKey, any], b: [PropertyKey, any]): number;
/**
 * Get the enumerable own property keys of an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function getKeys(obj: any): string[];
/**
 * Get an own property value from an object safely.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function getOwn(obj: any, propKey: PropertyKey): any;
/**
 * Get all own property values from an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function getOwnPropertyValues<T>(obj: {
    [key: PropertyKey]: T;
} | null | undefined): T[];
/**
 * Check if an object has any enumerable own properties.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function hasKeys(obj: any): obj is PropertyBag;
/**
 * Check if an object has an own property.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function hasOwn(obj: any, propKey: PropertyKey): obj is object & PropertyBag;
/**
 * Check if a value is an object (including arrays).
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function isObject(value: any): value is {
    [key: PropertyKey]: any;
};
/**
 * Check if a value is a plain object (not an array, not a built-in).
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function isObjectObject(value: any): value is {
    [key: PropertyKey]: any;
};
/**
 * Get all own property entries (key-value pairs) from an object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function objectEntries(obj: any): Array<[PropertyKey, any]>;
/**
 * Deep merge source object into target object.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function merge<T extends object, U extends object>(target: T, source: U): T & U;
/**
 * Convert an object to a new object with sorted keys.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function toSortedObject<T extends object>(obj: T): T;
/**
 * Create an object from entries with sorted keys.
 */
/*@__NO_SIDE_EFFECTS__*/
export declare function toSortedObjectFromEntries<T = any>(entries: Iterable<[PropertyKey, T]>): SortedObject<T>;
