hyper/app/config.ts

154 lines
4.4 KiB
TypeScript
Raw Normal View History

import chokidar from 'chokidar';
2019-11-28 05:17:01 -09:00
import notify from './notify';
import {_import, getDefaultConfig} from './config/import';
import _openConfig from './config/open';
import {cfgPath, cfgDir} from './config/paths';
import {getColorMap} from './utils/colors';
2023-06-26 01:29:50 -08:00
import type {parsedConfig, configOptions} from '../lib/config';
2021-01-07 02:44:09 -09:00
import {app} from 'electron';
2020-06-19 04:51:34 -08:00
const watchers: Function[] = [];
2020-04-27 05:32:08 -08:00
let cfg: parsedConfig = {} as any;
let _watcher: chokidar.FSWatcher;
2020-01-02 05:44:11 -09:00
2020-04-27 05:32:08 -08:00
export const getDeprecatedCSS = (config: configOptions) => {
2020-01-02 05:44:11 -09:00
const deprecated: string[] = [];
const deprecatedCSS = ['x-screen', 'x-row', 'cursor-node', '::selection'];
2020-03-25 02:15:08 -08:00
deprecatedCSS.forEach((css) => {
if (config.css?.includes(css) || config.termCSS?.includes(css)) {
2020-01-02 05:44:11 -09:00
deprecated.push(css);
}
});
return deprecated;
};
const checkDeprecatedConfig = () => {
if (!cfg.config) {
return;
}
const deprecated = getDeprecatedCSS(cfg.config);
if (deprecated.length === 0) {
return;
}
const deprecatedStr = deprecated.join(', ');
notify('Configuration warning', `Your configuration uses some deprecated CSS classes (${deprecatedStr})`);
};
2016-07-07 06:46:58 -08:00
2019-11-28 05:17:01 -09:00
const _watch = () => {
if (_watcher) {
return;
}
const onChange = () => {
// Need to wait 100ms to ensure that write is complete
setTimeout(() => {
cfg = _import();
notify('Configuration updated', 'Hyper configuration reloaded!');
watchers.forEach((fn) => {
fn();
});
checkDeprecatedConfig();
}, 100);
};
_watcher = chokidar.watch(cfgPath);
_watcher.on('change', onChange);
_watcher.on('error', (error) => {
console.error('error watching config', error);
});
2021-01-07 02:44:09 -09:00
2022-01-03 04:08:38 -09:00
app.on('before-quit', () => {
2021-01-07 02:44:09 -09:00
if (Object.keys(_watcher.getWatched()).length > 0) {
2022-01-03 04:08:38 -09:00
_watcher.close().catch((err) => {
console.warn(err);
});
2021-01-07 02:44:09 -09:00
}
});
};
2020-01-02 05:44:11 -09:00
export const subscribe = (fn: Function) => {
watchers.push(fn);
return () => {
watchers.splice(watchers.indexOf(fn), 1);
};
};
2019-11-28 05:17:01 -09:00
export const getConfigDir = () => {
// expose config directory to load plugin from the right place
return cfgDir;
};
2023-06-28 22:21:51 -08:00
export const getDefaultProfile = () => {
return cfg.config.defaultProfile || cfg.config.profiles[0]?.name || 'default';
};
// get config for the default profile, keeping it for backward compatibility
2019-11-28 05:17:01 -09:00
export const getConfig = () => {
2023-06-28 22:21:51 -08:00
return getProfileConfig(getDefaultProfile());
};
export const getProfiles = () => {
return cfg.config.profiles;
};
export const getProfileConfig = (profileName: string): configOptions => {
const {profiles, defaultProfile, ...baseConfig} = cfg.config;
const profileConfig = profiles.find((p) => p.name === profileName)?.config || {};
for (const key in profileConfig) {
if (typeof baseConfig[key] === 'object' && !Array.isArray(baseConfig[key])) {
baseConfig[key] = {...baseConfig[key], ...profileConfig[key]};
} else {
baseConfig[key] = profileConfig[key];
}
}
return {...baseConfig, defaultProfile, profiles};
2016-07-07 12:49:10 -08:00
};
2019-11-28 05:17:01 -09:00
export const openConfig = () => {
return _openConfig();
};
2020-01-02 05:44:11 -09:00
export const getPlugins = (): {plugins: string[]; localPlugins: string[]} => {
2016-07-07 12:49:10 -08:00
return {
plugins: cfg.plugins,
localPlugins: cfg.localPlugins
};
2016-07-07 06:46:58 -08:00
};
2019-11-28 05:17:01 -09:00
export const getKeymaps = () => {
return cfg.keymaps;
};
2019-11-28 05:17:01 -09:00
export const setup = () => {
cfg = _import();
_watch();
checkDeprecatedConfig();
};
export {get as getWin, recordState as winRecord, defaults as windowDefaults} from './config/windows';
2020-04-27 05:32:08 -08:00
export const fixConfigDefaults = (decoratedConfig: configOptions) => {
const defaultConfig = getDefaultConfig().config!;
decoratedConfig.colors = getColorMap(decoratedConfig.colors) || {};
// We must have default colors for xterm css.
2020-04-27 05:32:08 -08:00
decoratedConfig.colors = {...defaultConfig.colors, ...decoratedConfig.colors};
return decoratedConfig;
};
2020-04-27 05:32:08 -08:00
export const htermConfigTranslate = (config: configOptions) => {
2020-01-02 05:44:11 -09:00
const cssReplacements: Record<string, string> = {
'x-screen x-row([ {.[])': '.xterm-rows > div$1',
'.cursor-node([ {.[])': '.terminal-cursor$1',
'::selection([ {.[])': '.terminal .xterm-selection div$1',
'x-screen a([ {.[])': '.terminal a$1',
'x-row a([ {.[])': '.terminal a$1'
};
2020-03-25 02:15:08 -08:00
Object.keys(cssReplacements).forEach((pattern) => {
const searchvalue = new RegExp(pattern, 'g');
const newvalue = cssReplacements[pattern];
config.css = config.css?.replace(searchvalue, newvalue);
config.termCSS = config.termCSS?.replace(searchvalue, newvalue);
});
return config;
};