/*!
 * Copyright 2017 - 2020 by ChartIQ, Inc.
 * All rights reserved.
 */
/**
 * This client provides run-time access to Finsemble's configuration.
 * The Config Client functions similar to a global store created with the Distributed Store Client and offers many of the same methods.
 * Values modified at runtime are not persisted.
 *
 *
 * See the [Configuration tutorial](tutorial-Configuration.html) for a configuration overview.
 *
 * @module ConfigClient
 */
/**
This is how we want our API to work going foward, the way the world does it: import { processAndSet } from "configClient"
```
export const processAndSet = () => { ... }
```

This module's single exported object gives us backward compatibility when our core code does this: import { ConfigClient } from "configClient"
and provides the object that is attached to FSBL.Clients. This export should be kept as clean and simple as possible.
```
export const ConfigClient = {
   processAndSet
}
```

The default export gives us backward compatibility where our core code does this: import ConfigClient from "configClient"
This can be eliminated when our core core is converted to normal imports as in the first example.
```
export default ConfigClient;
```
*/
import { QueryResponse } from "./routerClient";
import { StandardErrorCallback, StandardPromise, StandardError, Manifest } from "../types";
import { ListenerFunction } from "./StoreModel";
export declare type FieldOnlyParam = {
    field: string;
};
export declare type FieldAndValueParam = {
    field: string;
    value?: any;
};
export declare type FieldAndValueParams = FieldAndValueParam[] | string[];
export declare type ListenerParam = {
    field: string;
    listener: ListenerFunction;
};
export declare type RemoveListenersType = ListenerParam | ListenerParam[];
/**
 * Retrieves the entire manifest
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.getManifest(function(err, value){ });
 * const {err, data} = await FSBL.Clients.ConfigClient.getManifest();
 * ```
 */
export declare const getManifest: (cb?: StandardErrorCallback<Manifest> | undefined) => StandardPromise<Manifest>;
/**
 * Get a value from the config.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.getValue({ field:'field1' }, function(err,value){ });
 * FSBL.Clients.ConfigClient.getValue('field1', function(err,value){ });
 * const {err, data} = await FSBL.Clients.ConfigClient.getValue({ field:'field1' });
 * const {err, data} = await FSBL.Clients.ConfigClient.getValue('field1');
 * ```
 * @param {Function} cb Will return the value if found.
 */
export declare const getValue: <T = any>(params: FieldOnlyParam | string, cb?: StandardErrorCallback<T> | undefined) => StandardPromise<T>;
/**
 * Get multiple values from the config.
 *
 * Deprecated functionality: If there are no fields provided, the complete configuration manifest is returned (use getManifest()).
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.getValues(['field1','field2'], function(err,values){ });
 * FSBL.Clients.ConfigClient.getValues(null, callback); // returns the complete manifest containing the finsemble property
 * const {err, data} = await FSBL.Clients.ConfigClient.getValues(['field1', 'field2']);
 * ```
 * @param {fieldOnlyParam[] | string[]} fields An array of field objects.
 * @param {Function} cb Will return the value if found.
 */
export declare const getValues: <T = any>(fields?: string[] | FieldOnlyParam[] | null | undefined, cb?: StandardErrorCallback<Record<string, T>> | undefined) => StandardPromise<Record<string, T>>;
/**
 * Set a value in the config. Setting a value will trigger events that you can listen to using <a href="#addlistener">`addListener()`</a>.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.setValue({ field:'field1', value:"new value" }, function(err){ });
 * const {err} = await FSBL.Clients.ConfigClient.setValue({ field:'field1', value:'new value' })
 * ```
 * @param {function} cb Optional callback
 */
export declare const setValue: (params: FieldAndValueParam, cb?: StandardErrorCallback<void> | undefined) => Promise<{
    err: string | null | undefined;
}>;
/**
 * This will set multiple values in the config.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.setValues([{ field:'field1', value: "new value" }]);
 * const {err} = await FSBL.Clients.ConfigClient.setValues([{ field:'field1', value: "new value" }]);
 * ```
 * @param {function} cb Optional callback
 */
export declare const setValues: (fields: FieldAndValueParams, cb?: StandardErrorCallback<void> | undefined) => Promise<{
    err: string | null | undefined;
}>;
/**
 * Remove a value from the config.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.removeValue('field1', function(err){ });
 * const {err} = await FSBL.Clients.ConfigClient.removeValue('field1');
 * ```
 * @param {String} field - Name of field to remove
 * @param {Function} cb -  Returns an error if there is one
 */
export declare const removeValue: (field: String, cb?: StandardErrorCallback<void> | undefined) => Promise<{
    err: string | null | undefined;
}>;
/**
 * Removes multiple values from the config.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.removeValues(['field1'], function(err){ });
 * const {err} = await FSBL.Clients.ConfigClient.removeValues(['field1'])
 * ```
 * @param {fieldAndValueParams} params - An Array of field objects
 * @param {Function} cb -  Returns an error if there is one.
 */
export declare const removeValues: (params: FieldAndValueParams, cb?: StandardErrorCallback<void> | undefined) => Promise<{
    err: StandardError;
}>;
/**
 * Add a listener to the config at either the root config level or field level. If no field is given, the root config level is used. You can also listen for changes to config fields any number of levels deep -- finsemble.configitem.deeperconfigitem.evendeeperconfigitem
 *
 * ```JavaScript
 * let myFunction = function(err,data){};
 * FSBL.Clients.ConfigClient.addListener({ field:'field1' }, myFunction, cb);
 * ```
 * @param {Function} fn The function to be called when the observed piece of config is modified.
 * @param {Function} cb Callback to be invoked after the listener is added.
 */
export declare const addListener: <T = any>(params: {
    field: string | null;
}, fn: ListenerFunction<T>, cb?: (() => void) | undefined) => Promise<void>;
/**
 * Add an array of listeners as objects or strings. If using strings, you must provide a function callback as the second parameter.
 *
 * ```JavaScript
 * let myFunction = function(err,data){}
 * FSBL.Clients.ConfigClient.addListeners(
 * 	[
 * 		{ field: "field1", listener: myFunction },
 * 		{ field: "field2", listener: myFunction }
 * 	],
 * 	null,
 * 	cb
 * );
 *
 * FSBL.Clients.ConfigClient.addListeners(
 * [{ field: "field1" }, { field: "field2", listener: myFunction }],
 * myFunction,
 * cb
 * );
 *
 * FSBL.Clients.ConfigClient.addListeners(["field1", "field2"], myFunction, cb);
 * ```
 * @param {listenerParam[] | fieldOnlyParam | string[]} params
 * @param {function} fn The function to be called when the observed piece of config is modified.
 * @param {function} cb Callback to be invoked after the listeners are added.

 */
export declare const addListeners: <T = any>(params: ListenerParam[] | string[], fn: ListenerFunction<T>, cb?: (() => void) | undefined) => Promise<void> | undefined;
/**
 * Remove a listener from config. If no field is given, we look for a config root listener
 *
 * ```JavaScript
 * let myFunction = function(err,data){ }
 * FSBL.Clients.ConfigClient.removeListener({
 * 	field:'field1'
 * }, myFunction, function(err, bool){ });
 * FSBL.Clients.ConfigClient.removeListener(myFunction, function(err, bool){ });
 * ```
 * @param {function} fn The listener to remove.
 * @param {function} cb Returns true if it was successful in removing the listener.
 *
 */
export declare const removeListener: (params: {
    field: string | null;
}, fn: ListenerFunction<any>, cb?: Function | undefined) => void;
/**
 * Remove an array of listeners from the config
 *
 * ```JavaScript
 * let myFunction = function(err,data){ }
 * FSBL.Clients.ConfigClient.removeListeners({
 * 	field: 'field1'
 * }, MyFunction, function(bool){ });
 * FSBL.Clients.ConfigClient.removeListeners([{ field:'field1', listener: MyFunction }], function(bool){ });
 * FSBL.Clients.ConfigClient.removeListeners(['field1'], MyFunction, function(bool) { });
 * ```
 * @param {removeListenersType} params
 * @param {function} fn The listener to remove
 * @param {function} cb Returns true if it was successful in removing the listener.
 *
 */
export declare const removeListeners: (params: RemoveListenersType, fn?: ListenerFunction<any> | undefined, cb?: StandardErrorCallback<boolean> | undefined) => void;
/**
 * Dynamically set config values within the Finsemble configuration.  New config properties may be set or existing ones modified. Note that configuration changes will not necessarily dynamically modify the components or services that use the corresponding configuration -- it depends if the component or service handles the corresponding change notifications (either though PubSub or the config's DataStore). Also, these changes do not persist in any config files.
 *
 * <b>Note</b>: Anytime config is set using this API, the newConfig along with the updated manifest will by published to the PubSub topic "Config.changeNotification".  To get these notifications any component or service can subscribe to the topic. An example is shown below.
 *
 * <b>Note</b>: Anytime config is set using this API, the dataStore underlying configuration 'Finsemble-Configuration-Store' will also be updated. To get these dataStore events a listener can be set as shown in the example below. However, any config modifications made directly though the DataStore will not result in corresponding PubSub notifications.
 *
 *  <b>Caution</b>: During dynamic configuration, Finsemble can overwrite components already in the configuration when `ConfigClient.processAndSet` is called. To prevent this from happening, set `manifest.component.category = "system"` in the config of the component. This setting is used, for example, to prevent system UI components from being dropped out of the config.
 *
 * ```JavaScript
 * // Examples using processAndSet()
 * FSBL.Clients.ConfigClient.processAndSet({ newConfig: { myNewConfigField: 12345 }, overwrite: false });
 * FSBL.Clients.ConfigClient.processAndSet(
 * {
 *	newConfig: {
 *		"myNewConfigField": 12345,
 *		"myNewConfigObject": {
 *			A: "this is a test",
 *			B: "more test"
 *		},
 *		"importConfig": [
 *			"$applicationRoot/configs/application/test.json",
 *		]
 *	},
 *	overwrite: true,
 *  replace: false,
 * },
 *	function (err, finsemble) {
 *		if (err) {
 *			console.error("ConfigClient.set", err);
 *		} else {
 *			console.log("new finsemble config", finsemble);
 *		}
 *	}
 * );
 *
 *  // example subscribing to PubSub to get notifications of dynamic updates
 * RouterClient.subscribe("Config.changeNotification", function (err, notify) {
 *		console.log("set notification", notify.data.newConfig, notify.data.finsemble);
 *	});
 *
 *  // example using DataStore to get notifications of dynamic updates
 * DistributedStoreClient.getStore({ store: 'Finsemble-Configuration-Store', global: true }, function (err, configStore) {
 *		configStore.addListener({ field: "finsemble" }, function (err, newFinsembleConfig) {
 *			console.log("new manifest.finsemble configuration", newFinsembleConfig);
 *		});
 * });
 * ```
 *
 * @param {object} params
 * @param {object} params.newConfig Provides the configuration properties to add into the existing configuration under manifest.finsemble. This config must match the Finsemble config requirements as described in the [Configuration tutorial]{@tutorial Configuration}. It can include importConfig references to dynamically fetch additional configuration files.
 * @param {boolean} params.overwrite If true then overwrite any preexisting config with new config (can only set to true when running from same origin, not cross-domain); if false then newConfig must not match properties of existing config, including service and component configuration.
 * @param {boolean} params.replace True specifies any component, app, or service definitions in the new config will place all existing non-system component and service configuration
 * @param {StandardErrorCallback} callback Callback to be invoked upon task completion.
 * @return {Promise<Manifest>} Returns the resulting manifest
 *
 */
export declare const processAndSet: (params: {
    newConfig: Record<string, any>;
    overwrite: boolean;
    replace: boolean;
}, cb?: StandardErrorCallback<QueryResponse<Manifest>> | undefined) => StandardPromise<Manifest>;
/**
 * Sets a value on the configStore and persists that value to storage. On application restart, this value will overwrite any application defaults.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.setPreference({
 * 	field: "finsemble.initialWorkspace",
 * 	value: "Workspace 2"
 * }, (err, response) => {
 * 		//preference has been set
 * });
 * const {err, data} = await FSBL.Clients.ConfigClient.setPreference({field: "finsemble.initialWorkspace", value: "Workspace 2"});
 * ```
 * @param {fieldAndValueParam} params
 * @param {StandardErrorCallback} callback Callback to be invoked when preferences have been retrieved from the service or on error.
 */
export declare const setPreference: (params: FieldAndValueParam, cb?: StandardErrorCallback<void> | undefined) => StandardPromise<void>;
/**
/**
 * Retrieves all of the preferences set for the application.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.getPreferences((err, preferences)=> {
 * 		 if (!err) {
 * 		 	console.log(preferences); // an object containing the entire user preferences.
 * 		 }
 * });
 * const {err, data} = await FSBL.Clients.ConfigClient.getPreferences();
 * ```
 *
 * @param {StandardErrorCallback} callback Callback to be invoked when preferences have been retrieved from the service.
 */
export declare const getPreferences: (cb?: StandardErrorCallback<Record<string, any> | null> | undefined) => StandardPromise<Record<string, any> | null>;
/**
 * Reset a user preference value to default. On application restart, the application default value will be used instead of the preference.
 *
 * ```JavaScript
 * FSBL.Clients.ConfigClient.unsetPreference({
 * 	field: "finsemble.initialWorkspace",
 * }, (err, response) => {
 * 		//preference has been unset
 * });
 * const {err, data} = await FSBL.Clients.ConfigClient.unsetPreference({field: "finsemble.initialWorkspace"});
 * ```
 * @param params The preference field to unset.
 * @param callback The callback to be invoked after the preference is removed or on error.
 */
export declare const unsetPreference: (params: FieldOnlyParam, cb?: StandardErrorCallback<void> | undefined) => StandardPromise<void>;
/**
 * @ignore
 */
export declare const ConfigClient: {
    /**
     * For backward compatibility
     * @private
     * @deprecated
     */
    initialize(): void;
    /**
     * For backward compatibility
     * @private
     * @deprecated
     */
    onReady: (cb?: any) => void;
    /**
     * @private
     * @deprecated
     */
    triggerListeners(listenerKey: string, data: any): void;
    /**
     * @private
     * @deprecated
     */
    handleChanges(err: StandardError, response: {
        data: {
            store: string;
            storeData: any;
            field: string | null;
            value: any;
        };
    }): void;
    /**
     * @private
     * @deprecated
     */
    changeSub(change: string): Promise<void>;
    addListener: <T = any>(params: {
        field: string | null;
    }, fn: ListenerFunction<T>, cb?: (() => void) | undefined) => Promise<void>;
    addListeners: <T_1 = any>(params: ListenerParam[] | string[], fn: ListenerFunction<T_1>, cb?: (() => void) | undefined) => Promise<void> | undefined;
    getManifest: (cb?: StandardErrorCallback<Manifest> | undefined) => StandardPromise<Manifest>;
    getPreferences: (cb?: StandardErrorCallback<Record<string, any> | null> | undefined) => StandardPromise<Record<string, any> | null>;
    getValue: <T_2 = any>(params: FieldOnlyParam | string, cb?: StandardErrorCallback<T_2> | undefined) => StandardPromise<T_2>;
    getValues: <T_3 = any>(fields?: string[] | FieldOnlyParam[] | null | undefined, cb?: StandardErrorCallback<Record<string, T_3>> | undefined) => StandardPromise<Record<string, T_3>>;
    processAndSet: (params: {
        newConfig: Record<string, any>;
        overwrite: boolean;
        replace: boolean;
    }, cb?: StandardErrorCallback<QueryResponse<Manifest>> | undefined) => StandardPromise<Manifest>;
    removeListener: (params: {
        field: string | null;
    }, fn: ListenerFunction<any>, cb?: Function | undefined) => void;
    removeListeners: (params: RemoveListenersType, fn?: ListenerFunction<any> | undefined, cb?: StandardErrorCallback<boolean> | undefined) => void;
    removeValue: (field: String, cb?: StandardErrorCallback<void> | undefined) => Promise<{
        err: string | null | undefined;
    }>;
    removeValues: (params: FieldAndValueParams, cb?: StandardErrorCallback<void> | undefined) => Promise<{
        err: StandardError;
    }>;
    setPreference: (params: FieldAndValueParam, cb?: StandardErrorCallback<void> | undefined) => StandardPromise<void>;
    setValue: (params: FieldAndValueParam, cb?: StandardErrorCallback<void> | undefined) => Promise<{
        err: string | null | undefined;
    }>;
    setValues: (fields: FieldAndValueParams, cb?: StandardErrorCallback<void> | undefined) => Promise<{
        err: string | null | undefined;
    }>;
    unsetPreference: (params: FieldOnlyParam, cb?: StandardErrorCallback<void> | undefined) => StandardPromise<void>;
};
/**
 * @ignore
 */
export default ConfigClient;
//# sourceMappingURL=configClient.d.ts.map