import { promises as fs } from "fs"; import path from "path"; import yaml from "js-yaml"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config"; export async function widgetsFromConfig() { checkAndCopyConfig("widgets.yaml"); const widgetsYaml = path.join(CONF_DIR, "widgets.yaml"); const rawFileContents = await fs.readFile(widgetsYaml, "utf8"); const fileContents = substituteEnvironmentVars(rawFileContents); const widgets = yaml.load(fileContents); if (!widgets) return []; // map easy to write YAML objects into easy to consume JS arrays const widgetsArray = widgets.map((group, index) => ({ type: Object.keys(group)[0], options: { index, ...group[Object.keys(group)[0]], }, })); return widgetsArray; } export async function cleanWidgetGroups(widgets) { return widgets.map((widget, index) => { const sanitizedOptions = widget.options; const optionKeys = Object.keys(sanitizedOptions); // delete private options from the sanitized options ["username", "password", "key"].forEach((pO) => { if (optionKeys.includes(pO)) { delete sanitizedOptions[pO]; } }); // delete url from the sanitized options if the widget is not a search or glances widgeth if (widget.type !== "search" && widget.type !== "glances" && optionKeys.includes("url")) { delete sanitizedOptions.url; } return { type: widget.type, options: { index, ...sanitizedOptions, }, }; }); } export async function getPrivateWidgetOptions(type, widgetIndex) { const widgets = await widgetsFromConfig(); const privateOptions = widgets.map((widget) => { const { index, url, username, password, key } = widget.options; return { type: widget.type, options: { index, url, username, password, key, }, }; }); return type !== undefined && widgetIndex !== undefined ? privateOptions.find((o) => o.type === type && o.options.index === parseInt(widgetIndex, 10))?.options : privateOptions; }