import type { ValueOf } from 'type-fest';
/**
 * Container repository interface
 */
export interface Repository extends Record<string, any> {
}
/**
 * Provides a simple chainable interface for working with collections of data
 */
export default class Container<I = any> {
    /**
     * Identifier
     */
    ident?: string;
    /**
     * The container store
     */
    repository: Record<string, any>;
    /**
     * Class constructor
     *
     * @param repository - Key-value data store
     */
    constructor(repository?: I);
    /**
     * Returns the repository in its entirety as a plain JS object
     *
     * @example
     * ```js
     * container.all()
     * ```
     */
    all(): Record<string, any>;
    /**
     * Return a number indicating the length of a matched key
     * in the repository.
     *
     * If no key is provided, returns the length of the repository.
     *
     * @param key - search key
     * @returns count of items
     */
    count(key?: string): number;
    /**
     * Use each value as parameters in a supplied callback
     *
     * @example
     * ```js
     * container.withEntries('key', (key, value) => doSomething)
     * ```
     */
    each(key: string, callFn: (key: any, value: any) => void): this;
    /**
     * Calls a supplied function for every repository value, passing
     * the item's key and value as callback parameters.
     *
     * @example
     * ```js
     * container.withEntries('key', (key, value) => doSomething)
     * ```
     */
    every(fn: (key: string, value: any) => any): this;
    /**
     * Merges object created from an array of tuples with the repository.
     *
     * @example
     * ```js
     * container.getEntries()
     * ```
     *
     * @example
     * ```js
     * container.getEntries('key')
     * ```
     */
    fromEntries(entries: [string, any][]): this;
    /**
     * Returns a value from the the repository.
     *
     * @remarks
     * If no key is passed the container store will be returned.
     *
     * @example
     * ```js
     * container.get('container.container-item')
     * ```
     *
     * @example
     * ```js
     * container.get(['container', 'container-item'])
     * ```
     */
    get<T = any>(key: Array<string> | string): T;
    /**w
     * Returns a repository key and value as a tuple
     *
     * @remarks
     * If no key is passed the container store will be used.
     *
     * @example
     * ```js
     * container.getEntries()
     * ```
     *
     * @example
     * ```js
     * container.getEntries('key')
     * ```
     */
    getEntries<T = any>(key?: string): [string, ValueOf<T>][];
    /**
     * Returns an array of values of the enumerable keys of a repository object
     *
     * @example
     * ```js
     * container.getKeys('item')
     * // => returns keys of container.repository[item]
     * ```
     *
     * @example
     * ```js
     * container.getKeys()
     * // => returns keys of container.repository
     * ```
     */
    getKeys(key?: string): string[];
    /**
     * Get a repository item as a {@link MapConstructor}.
     *
     * @remarks
     * If no key is passed the container store is mapped.
     *
     * @example
     * Returns `repository.item` as a Map:
     * ```js
     * container.getMap('item')
     * ```
     *
     * @example
     * Returns the entire repository as a Map:
     *
     * ```js
     * container.getMap()
     * ```
     */
    getMap(key?: string): Map<string, any>;
    /**
     * Returns an array of values of the enumerable properties of a repository object
     *
     * @example
     * ```js
     * container.getValues('container.container-item')
     * ```
     *
     * @example
     * ```js
     * container.getValues()
     * // => returns values from entire store
     * ```
     */
    getValues(key?: string): any[];
    /**
     * Return a boolean indicating if a given key exists.
     *
     * @example
     * ```js
     * container.has('my-key')
     * // true if container.repository['my-key'] exists
     * ```
     */
    has(key: string): boolean;
    /**
     * Return a boolean indicating if the given key matches the given value.
     *
     * @example
     * ```js
     * container.is('my-key', {whatever: 'value'})
     * // True if container.repository['my-key'] === {whatever: 'value'}
     * ```
     */
    is(key: string, value: any): boolean;
    /**
     * Return true if object is an array.
     *
     * @example
     * ```js
     * container.isArray('my-key')
     * // True if container.repository['my-key'] is an array
     * ```
     *
     * @param key - The key to check
     * @returns True if the value is an array
     */
    isArray(key: string): boolean;
    /**
     * Return true if object is defined.
     *
     * @example
     * True if container has a 'my-key' entry with a definite value.
     *
     * ```js
     * container.isDefined('my-key')
     * ```
     *
     * @param key - The key to check.
     * @returns True if the key is defined.
     */
    isDefined(key: string): boolean;
    /**
     * Checks if value is empty. A value is considered empty unless
     * it’s an arguments object, array, string, or jQuery-like
     * collection with a length greater than 0 or an object with
     * own enumerable properties.
     *
     * @example
     * ```js
     * container.isEmpty('my-key')
     * // True if object associated with 'my-key' is empty.
     * ```
     *
     * @param key - search key
     * @returns True if object is empty.
     */
    isEmpty(key?: string): boolean;
    /**
     * Return a boolean indicating if the given key's value is false
     *
     * @example
     * ```js
     * container.isFalse('my-key')
     * // True if container.repository['my-key'] === false
     * ```
     *
     * @param key - The key to check
     * @returns True if the key's value is false
     */
    isFalse(key: string): boolean;
    /**
     * Return true if object is a function
     *
     * @example
     * ```js
     * container.isFunction('my-key')
     * // True if object associated with 'my-key' is a fn.
     * ```
     *
     * @param key - The key to check.
     * @returns True if object is a function.
     */
    isFunction(key: string): boolean;
    /**
     * Return true if object is an instance of a class.
     *
     * @example
     * ```js
     * container.isInstanceOf('my-key', MyClass)
     * // True if object associated with 'my-key' is an instance of MyClass.
     * ```
     *
     * @param key - The key to check.
     * @param instance - The class to check.
     * @returns True if object is an instance of the class.
     */
    isInstanceOf(key: string, instance: any): boolean;
    /**
     * Return true if object is an instance of any of the classes.
     *
     * @example
     * ```js
     * container.isInstanceOfAny('my-key', [MyClass, MyOtherClass])
     * // True if object associated with 'my-key' is an instance of MyClass or MyOtherClass.
     * ```
     *
     * @param key - the key to check
     * @param instances - The classes to check against
     * @returns
     */
    isInstanceOfAny(key: string, instances: any[]): boolean;
    /**
     * Return true if object is not an array.
     *
     * @example
     * ```js
     * container.isNotArray('my-key')
     * // True if container.repository['my-key'] is not an array
     * ```
     *
     * @param key - The key to check
     * @returns True if object is not an array
     */
    isNotArray(key: string): boolean;
    /**
     * Checks if value is not empty. A value is considered empty unless
     * it’s an arguments object, array, string, or jQuery-like
     * collection with a length greater than 0 or an object with
     * own enumerable properties.
     *
     * @example
     * ```js
     * container.isNotEmpty('my-key')
     * // True if object associated with 'my-key' is not empty.
     * ```
     *
     * @param key - search key
     * @returns True if object is not empty.
     */
    isNotEmpty(key: string): boolean;
    /**
     * Return true if object is not a function
     *
     * @example
     * ```js
     * container.isNotFunction('my-key')
     * // True if object associated with 'my-key' is not a fn.
     * ```
     *
     * @param key - The key to check.
     * @returns True if object is not a function.
     */
    isNotFunction(key: string): boolean;
    /**
     * Return true if object is not an instance of a class.
     *
     * @example
     * ```js
     * container.isNotInstanceOf('my-key', MyClass)
     * // True if object associated with 'my-key' is not an instance of MyClass.
     * ```
     *
     * @param key - The key to check.
     * @param instance - The class to check against
     * @returns
     */
    isNotInstanceOf(key: string, instance: any): boolean;
    /**
     * Return true if object is not an instance of any of the classes.
     *
     * @example
     * ```js
     * container.isNotInstanceOfAny('my-key', [MyClass, MyOtherClass])
     * // True if object associated with 'my-key' is not an instance of MyClass or MyOtherClass.
     * ```
     *
     * @param key - search key
     * @param instances - classes
     * @returns
     */
    isNotInstanceOfAny(key: string, instances: any[]): boolean;
    /**
     * Return true if object is not null.
     *
     * @example
     * ```js
     * container.isNotNull('my-key')
     * // True if container.repository['my-key'] is not null
     * ```
     *
     * @param key - The key to check
     * @returns True if object is not null
     */
    isNotNull(key: string): boolean;
    /**
     * Return true if object is not a number.
     *
     * @example
     * ```js
     * container.isNumber('my-key')
     * // True if container.repository['my-key'] is not a number
     * ```
     *
     * @param key - The key to check
     * @returns True if object is not a number
     */
    isNotNumber(key: string): boolean;
    /**
     * Return true if object is not a string.
     *
     * @example
     * ```js
     * container.isString('my-key')
     * // True if container.repository['my-key'] is not a string
     * ```
     *
     * @param key - The key to check
     * @returns True if object is not a string
     */
    isNotString(key: string): boolean;
    /**
     * Return true if object is null.
     *
     * @example
     * ```js
     * container.isNull('my-key')
     * // True if container.repository['my-key'] is null
     * ```
     *
     * @param key - The key to check
     * @returns True if object is null
     */
    isNull(key: string): boolean;
    /**
     * Return true if object is a number.
     *
     * @example
     * ```js
     * container.isNumber('my-key')
     * // True if container.repository['my-key'] is a number
     * ```
     *
     * @param key - The key to check
     * @returns True if object is a number
     */
    isNumber(key: string): boolean;
    /**
     * Return true if object is a string.
     *
     * @example
     * ```js
     * container.isString('my-key')
     * // True if container.repository['my-key'] is a string
     * ```
     *
     * @param key - The key to check
     * @returns True if object is a string
     */
    isString(key: string): boolean;
    /**
     * Return a boolean indicating if the given key's value is true
     *
     * @example
     * ```js
     * container.isTrue('my-key')
     * // True if container.repository['my-key'] === true
     * ```
     *
     * @param key - The key to check
     * @returns True if the key's value is true
     */
    isTrue(key: string): boolean;
    /**
     * Return true if object is not defined.
     *
     * @example
     * ```js
     * container.isDefined('my-key')
     * // True if container has a 'my-key' entry with a definite value.
     * ```
     *
     * @param key - The key to check.
     * @returns True if the key is not defined.
     */
    isUndefined(key: string): boolean;
    /**
     * Merge a supplied value with an existing repository value
     *
     * @example
     * ```js
     * container.merge('key', {merge: values})
     * ```
     *
     * @param key - The key of the item to merge
     * @param value - The value to merge with the existing value
     */
    merge(key: string, value: any): this;
    /**
     * Merge values onto the container store.
     *
     * @example
     * ```js
     * container.mergeStore({test: 'foo'})
     * ```
     *
     * @param values - Values to merge onto the container store
     * @returns The container instance
     */
    mergeStore(values: Repository): this;
    /**
     * Mutate a repository item
     *
     * @example
     * ```js
     * container.mutate('key', currentValue => modifiedValue)
     * ```
     *
     * @param key - The key of the item to mutate
     * @param mutationFn - The mutation function to run on the item
     */
    mutate(key: string, mutationFn: (value?: any) => any): this;
    /**
     * Runs the entire repository through the supplied fn and returns
     * the transformed value. The transformed repository replaces the
     * original.
     *
     * @example
     * ```js
     * container.mutate('key', currentValue => modifiedValue)
     * ```
     */
    mutateStore(mutationFn: (value?: any) => any): this;
    /**
     * delete
     *
     * Delete an entry from the repository
     *
     * @example
     * ```js
     * container.remove('my-key')
     * // Remove container.repository['my-key']
     * ```
     */
    remove(key: string): this;
    /**
     * Set a repository value
     *
     * @example
     * ```js
     * container.set('key', value)
     * ```
     */
    set(key: Array<string> | string, value: any): this;
    /**
     * Replace the store with an all new set of values
     *
     * @example
     * ```js
     * container.setStore({
     *  new: ['store', 'contents'],
     * })
     * ```
     */
    setStore(repository: Repository): this;
    /**
     * Retrieve a container item, running it through the supplied fn.
     *
     * @remarks
     * Returns the transformed value.
     *
     * @example
     * ```js
     * container.transform('key', currentValue => modifiedValue)
     * ```
     *
     * @param key - The key of the item to transform
     * @param fn - The function to transform the item with
     */
    transform(key: string, mutationFn: (value?: any) => any): any;
    /**
     * Runs the entire repository through the supplied fn and returns
     * the transformed value.
     *
     * @example
     * ```js
     * container.transform(store=> modifiedStore)
     * ```
     *
     * @param fn - Function to run on the repository
     * @returns The transformed repository
     */
    transformStore(transformFn: (value: any) => any): any;
    /**
     * Returns unique elements of an array item
     *
     * @example
     * ```js
     * container.unique('item')
     * ```
     */
    unique(key: string): any;
}
