@haystacks/async
Version:
A framework to build any number or any kind of native application or automation solution.
215 lines (207 loc) • 11.8 kB
JavaScript
/**
* @file configuration.js
* @module configuration
* @description Contains all of the configuration system commands.
* @requires module:dataBroker
* @requires module:ruleBroker
* @requires module:themeBroker
* @requires module:configurator
* @requires module:loggers
* @requires module:data
* @requires {@link https://www.npmjs.com/package/@haystacks/constants|@haystacks/constants}
* @requires {@link https://www.npmjs.com/package/path|path}
* @author Seth Hollingsead
* @date 2022/02/04
* @copyright Copyright © 2022-… by Seth Hollingsead. All rights reserved
*/
// Internal imports
import dataBroker from '../../brokers/dataBroker.js';
import ruleBroker from '../../brokers/ruleBroker.js';
import themeBroker from '../../brokers/themeBroker.js';
import configurator from '../../executrix/configurator.js';
import loggers from '../../executrix/loggers.js';
import D from '../../structures/data.js';
// External imports
import hayConst from '@haystacks/constants';
import path from 'path';
const {bas, biz, cfg, gen, msg, sys, wrd} = hayConst;
const baseFileName = path.basename(import.meta.url, path.extname(import.meta.url));
// framework.commandsBlob.commands.configuration.
const namespacePrefix = wrd.cframework + bas.cDot + sys.ccommandsBlob + bas.cDot + wrd.ccommands + bas.cDot + baseFileName + bas.cDot;
/**
* @function saveConfiguration
* @description Saves out all of the configuration data to a JSON file so custom user settings can be persisted between sessions.
* @param {string} inputData Not used for this command.
* @param {string} inputMetaData Not used for this command.
* @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to
* indicate if the application should exit or not exit, followed by the command output.
* @author Seth Hollingsead
* @date 2022/03/11
*/
async function saveConfiguration(inputData, inputMetaData) {
let functionName = saveConfiguration.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = [true, {}];
returnData[1] = await dataBroker.writeJsonDataToFile(await configurator.getConfigurationSetting(wrd.csystem, cfg.cappConfigPath) + wrd.cconfig + gen.cDotjson, JSON.stringify(D));
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function changeConfigurationSetting
* @description Persists a change to a user specified configuration setting.
* This enables the user to enable or disable console log flags to use for run-time debugging.
* This is useful also for automating changes to how and what is logged during execution.
* Further it is useful for when a test fails, it can be automatically re-run with a more detailed log.
* @param {array<string>} inputData An array that contains
* the fully qualified path to the configuration setting that should be changed and
* the data that should be assigned to it.
* inputData[0] = changeConfigurationSetting
* inputData[1] = fully.Qualified.Configuration.Path
* inputData[2] = value to assign to the configuration setting property
* @param {string} inputMetaData Not used for this command.
* @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to
* indicate if the application should exit or not exit, followed by the command output.
* @author Seth Hollingsead
* @date 2022/05/11
* @NOTE Test String 1: changeConfigurationSetting configuration.debugSetting.commandsBlob.commands.system true
* Test String 2: changeConfigurationSetting debugSetting.commandsBlob.commands.system true
*/
async function changeConfigurationSetting(inputData, inputMetaData) {
let functionName = changeConfigurationSetting.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = [true, {}];
let errorMessage = '';
if (inputData && inputData.length === 3) {
let dataPath = inputData[1];
dataPath = await ruleBroker.processRules([dataPath, ''], [biz.cgetWordsArrayFromString]);
// dataPath is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cdataPathIs + JSON.stringify(dataPath));
let newValue = inputData[2];
// newValue is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cnewValueIs + JSON.stringify(newValue));
if (dataPath[0] === wrd.cconfiguration) {
dataPath.shift(wrd.cconfiguration);
}
let configurationName = dataPath.pop();
// dataPath is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cdataPathIs + JSON.stringify(dataPath));
dataPath = dataPath.join(bas.cDot);
newValue = await ruleBroker.processRules([newValue, ''], [biz.cstringToDataType]);
await configurator.setConfigurationSetting(dataPath, configurationName, newValue);
returnData[1] = true;
} else {
// ERROR: Invalid entry, please enter a valid configuration namespace to change,
// and a value to assign to the configuration setting.
errorMessage = msg.cchangeConfigurationSettingMessage01 + msg.cchangeConfigurationSettingMessage02;
console.log(errorMessage);
returnData[1] = errorMessage;
// EXAMPLE: changeConfigurationSetting debugSetting.businessRules.rules.arrayParsing.commandArrayParsing.solveLehmerCode true
console.log(msg.cchangeConfigurationSettingMessage03);
}
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function listConfigurationThemes
* @description Lists all of the debug configuration themes currently installed in the resources/themes folder.
* @param {string} inputData Not used for this command.
* @param {string} inputMetaData Not used for this command.
* @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to
* indicate if the application should exit or not exit, followed by the command output.
* @author Seth Hollingsead
* @date 2022/06/10
*/
async function listConfigurationThemes(inputData, inputMetaData) {
let functionName = listConfigurationThemes.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = [true, {}];
let frameworkThemesPath = await configurator.getConfigurationSetting(wrd.csystem, cfg.cframeworkThemesPath);
frameworkThemesPath = path.resolve(frameworkThemesPath);
// frameworkThemesPath is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cframeworkThemesPathIs + frameworkThemesPath);
let themesList = await themeBroker.getNamedThemesFromRootPath(frameworkThemesPath);
// themesList is:
console.log(msg.cthemesListIs + JSON.stringify(themesList));
returnData[1] = themesList;
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function changeDebugConfigurationTheme
* @description Swaps out all of the debug settings with a different theme.
* @param {string} inputData An array that contains the name of the theme the user would like to switch to.
* inputData[0] = changeDebugConfigurationTheme
* inputData[1] = The name of the theme that the user would like to switch to.
* @param {string} inputMetaData Not used for this command.
* @return {array<boolean,string|integer|boolean|object|array>} An array with a boolean True or False value to
* indicate if the application should exit or not exit, followed by the command output.
* @author Seth Hollingsead
* @date 2022/06/13
*/
async function changeDebugConfigurationTheme(inputData, inputMetaData) {
let functionName = changeDebugConfigurationTheme.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + JSON.stringify(inputData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = [true, {}];
let errorMessage = '';
if (inputData && inputData.length === 2) {
let desiredThemeName = inputData[1];
// desiredThemeName is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cdesiredThemeNameIs + desiredThemeName);
let frameworkThemesPath = await configurator.getConfigurationSetting(wrd.csystem, cfg.cframeworkThemesPath);
frameworkThemesPath = path.resolve(frameworkThemesPath);
// frameworkThemesPath is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cframeworkThemesPathIs + frameworkThemesPath);
let namedThemePath = await themeBroker.getNamedThemePathFromRootPath(desiredThemeName, frameworkThemesPath);
if (namedThemePath !== false) {
// namedThemePath is verified:
await loggers.consoleLog(namespacePrefix + functionName, msg.cnamedThemePathIsVerified + namedThemePath);
await configurator.setConfigurationSetting(wrd.csystem, sys.cthemeConfigPath, namedThemePath);
let loadedThemeData = await themeBroker.loadTheme(namedThemePath);
// loadedThemeData is:
await loggers.consoleLog(namespacePrefix + functionName, msg.cloadedThemeDataIs + JSON.stringify(loadedThemeData));
let themeLoadedSuccessfully = await themeBroker.applyTheme(loadedThemeData);
returnData[1] = themeLoadedSuccessfully;
if (themeLoadedSuccessfully === false) {
// ERROR: There was an error applying the selected theme to the active debug settings configuration.
errorMessage = msg.cchangeDebugConfigurationThemeMessage01;
console.log(errorMessage);
returnData[1] = errorMessage;
} // End-if (themeLoadedSuccessfully === false)
} else {
// ERROR: The specified theme name was not found in the current list of supported themes.
errorMessage = msg.cchangeDebugConfigurationThemeMessage02;
console.log(errorMessage);
returnData[1] = errorMessage;
// You can find the available themes at the following path location:
console.log(msg.cchangeDebugConfigurationThemeMessage03 +
await configurator.getConfigurationSetting(wrd.csystem, cfg.cframeworkThemesPath));
}
} else {
// ERROR: Invalid entry, please enter a theme name you would like the debug settings to switch to when logging debug statements.
errorMessage = msg.cchangeDebugConfigurationThemeMessage04
console.log(errorMessage);
returnData[1] = errorMessage;
// EXAMPLE: changeDebugConfigurationTheme Skywalker
console.log(msg.cchangeDebugConfigurationThemeMessage05);
}
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData));
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
export default {
saveConfiguration,
changeConfigurationSetting,
listConfigurationThemes,
changeDebugConfigurationTheme
};