src/getConfig.js
import deepFreeze from 'deep-freeze';
import merge from 'lodash.merge';
import resolveProperties from './resolveProperties';
import loadConfigFile from './loadConfigFile';
/**
* Provides a configuration object based on a given config object and a json file loaded from the filesystem.
*
* @param {object} baseConfig - The default configuration before runtime config values are added.
* @param {object} [options] - An object with additional options
* @param {string} [options.file] - Absolute path to a json file that will be loaded at runtime.
* @param {boolean} [options.freeze=false] - Whether to freeze the returned config (and make it read-only)
* @param {string|array} [options.resolve=[]] - One or more special keys to resolve.
* @return {object} A read-only object containing all resolved values from `baseConfig` and `
*
* @see https://github.com/electron/electron/blob/master/docs/api/app.md#appgetpathname
* @see {@link resolveProperties}
*
* @example
* // config.js
* import { getConfig } from '@xailabs/electron-config';
* import myConfig from './myConfig.js';
* import {app} from 'electron';
*
* export default getConfig(myConfig, {
* file: `${app.getPath('appData')/my-config.json`
* });
*
*/
export default function getConfig(baseConfig, { file, freeze = false, resolve = [] } = {}) {
const runtimeConfig = loadConfigFile(file) || {};
const mergedConfig = merge({}, baseConfig, runtimeConfig);
const parsedConfig = resolveProperties(mergedConfig, resolve);
if (freeze) {
return deepFreeze(parsedConfig);
} else {
return parsedConfig;
}
}