UNPKG

@haystacks/async

Version:

A framework to build any number or any kind of native application or automation solution.

818 lines (797 loc) 71.1 kB
/** * @file constantStringParsing.js * @module constantStringParsing * @description Contains all system defined business rules for parsing strings related to constants. * @requires module:ruleParsing * @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/chalk|chalk} * @requires {@link https://nodejs.dev/} * @requires {@link https://www.npmjs.com/package/path|path} * @author Seth Hollingsead * @date 2022/04/25 * @copyright Copyright © 2022-… by Seth Hollingsead. All rights reserved */ // Internal imports import ruleParsing from '../ruleParsing.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 chalk from 'chalk'; 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.businessRules.rules.stringParsing.constantStringParsing. const namespacePrefix = wrd.cframework + bas.cDot + sys.cbusinessRules + bas.cDot + wrd.crules + bas.cDot + wrd.cstring + wrd.cParsing + bas.cDot + baseFileName + bas.cDot; /** * @function validateConstantsDataValidation * @description Validates that validation data to ensure that all the contents of the * constants validation data matches with the actual constants definitions. * @param {string} inputData The path of the constants file that should be validated. * @param {string} inputMetaData The name of the data hive that contains the appropriate matching constants validation data. * @return {boolean} True or False to indicate if all of the contents of the constants are fully validated or not. * @author Seth Hollingsead * @date 2022/01/23 */ async function validateConstantsDataValidation(inputData, inputMetaData) { let functionName = validateConstantsDataValidation.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = false; let foundAFailure = false; let processed = false; if (inputData && inputMetaData) { // Scanning constants phase 1 validation data for file: console.log(msg.cScanningConstantsValidationPhase1Message + inputData); let inputFilePath = path.resolve(inputData); const fileContents = await ruleParsing.processRulesInternal([inputFilePath, ''], [biz.cloadAsciiFileFromPath]); // fileContents are: await loggers.consoleLog(namespacePrefix + functionName, msg.cfileContentsAre + JSON.stringify(fileContents)); const fileContentsLineArray = fileContents.split(/\r?\n/); let colorizeLogsEnabled = await configurator.getConfigurationSetting(wrd.csystem, cfg.cenableColorizedConsoleLogs); // BEGIN processing all lines from file: await loggers.consoleLog(namespacePrefix + functionName, msg.cBeginProcessingAllLinesFromFile + inputData); for (const lineKey in fileContentsLineArray) { // BEGIN processing a line await loggers.consoleLog(namespacePrefix + functionName, msg.cBeginProcessingLine); // line is: await loggers.consoleLog(namespacePrefix + functionName, msg.clineIs + JSON.stringify(lineKey)); if (lineKey) { processed = true; // constants LineKey is: await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantsLineKeyIs + lineKey.toString(gen.cascii)); let lineInCode = fileContentsLineArray[lineKey]; // constants Line is: await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantsLineIs + lineInCode); let foundConstant = false; if (lineInCode.includes(sys.cexportconst) === true) { let lineArray = lineInCode.split(bas.cSpace); // lineArray[2] is: await loggers.consoleLog(namespacePrefix + functionName, msg.clineArray2Is + lineArray[2]); foundConstant = await validateConstantsDataValidationLineItemName(lineArray[2], inputMetaData); let qualifiedConstantsFilename = await ruleParsing.processRulesInternal([inputData, ''], [biz.cgetFileNameFromPath]); if (foundConstant === true) { if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cdisplayIndividualConstantsValidationPassMessages) === true) { let passMessage = wrd.cPASS + bas.cColon + bas.cSpace + lineArray[2] + bas.cSpace + wrd.cPASS; if (colorizeLogsEnabled === true) { passMessage = chalk.rgb(0,0,0)(passMessage); passMessage = chalk.bgRgb(0,255,0)(passMessage); } // End-if (colorizeLogsEnabled === true) console.log(qualifiedConstantsFilename + bas.cColon + bas.cSpace + passMessage); } // End-if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cdisplayIndividualConstantsValidationPassMessages) === true) } else { // Else-clause if (foundConstant === true) if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cdisplayIndividualCosntantsValidationFailMessages) === true) { let failMessage = wrd.cFAIL + bas.cColon + bas.cSpace + lineArray[2] + bas.cSpace + wrd.cFAIL; if (colorizeLogsEnabled === true) { failMessage = chalk.rgb(0,0,0)(failMessage); failMessage = chalk.bgRgb(255,0,0)(failMessage); } // End-if (colorizeLogsEnabled === true) let qualifiedConstantsPrefix = await determineConstantsContextQualifiedPrefix(qualifiedConstantsFilename, inputMetaData); let pluginName = ''; if (inputMetaData.includes(bas.cColon) && inputMetaData.toUpperCase().includes(wrd.cPLUGIN)) { let pluginConstantNamespaceArray = inputMetaData.split(bas.cColon); pluginName = pluginConstantNamespaceArray[0] + bas.cColon; } console.log(pluginName + qualifiedConstantsFilename + bas.cColon + bas.cSpace + failMessage); let suggestedLineOfCode = await determineSuggestedConstantsValidationLineOfCode(lineArray[2], qualifiedConstantsPrefix); if (suggestedLineOfCode !== '') { if (colorizeLogsEnabled === true) { suggestedLineOfCode = chalk.rgb(0,0,0)(suggestedLineOfCode); suggestedLineOfCode = chalk.bgRgb(255,0,0)(suggestedLineOfCode); } // End-if (colorizeLogsEnabled === true) console.log(msg.cSuggestedLineOfCodeIs + suggestedLineOfCode); } // End-if (suggestedLineOfCode !== '') } // End-if (await configurator.getConfigurationSetting(wrd.csystem, cfg.cdisplayIndividualCosntantsValidationFailMessages) === true) foundAFailure = true; } } // End-if (lineInCode.includes(sys.cexportconst) === true) } else { // ERROR: line is null or undefined: // file is: console.log(msg.cErrorLineIsNullOrUndefined + lineKey + msg.cSpaceFileIs + inputData); } // END processing a line await loggers.consoleLog(namespacePrefix + functionName, msg.cEndProcessingLine); } // End-for (const line in fileContentsLineArray) // END processing all lines from file: await loggers.consoleLog(namespacePrefix + functionName, msg.cEndProcessingAllLinesFromFile + inputData); } // End-if (inputData && inputMetaData) if (foundAFailure === false && processed === true) { // Make sure we didn't find a failure, and we also actually did some processing of the data file. // Otherwise this could just fall through and never read the file, but still return true. returnData = true; } await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function determineConstantsContextQualifiedPrefix * @description Takes the filename to a constants file and determines * The standard prefix that should be used in the code to reference that constants file. * @param {string} inputData The filename of the constants file or * the full path and file name of the constants file. (Should work just the same with either one) * @param {string} inputMetaData The name of the data hive that contains the appropriate matching constants validation data. * @return {string} A string code that represents the method to reference a constants file in the code. * @author Seth Hollingsead * @date 2022/01/24 */ async function determineConstantsContextQualifiedPrefix(inputData, inputMetaData) { let functionName = determineConstantsContextQualifiedPrefix.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = ''; if (inputData && inputMetaData) { returnData = inputData; let constantsNamespaceParentObject = await getConstantsValidationNamespaceParentObject(inputMetaData, ''); // constantsNamespaceParentObject is: // await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantsNamespaceParentObjectIs + JSON.stringify(constantsNamespaceParentObject)); let constantsFileNames = constantsNamespaceParentObject[sys.cConstantsFileNames]; let constantsShortNames = constantsNamespaceParentObject[sys.cConstantsShortNames]; for (let key in constantsFileNames) { if (inputData === constantsFileNames[key]) { returnData = constantsShortNames[key]; break; } // End-if (inputData === constantsFileNames[key]) } // End-for (let key in constantsFileNames) } // End-if (inputData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function determineSuggestedConstantsValidationLineOfCode * @description Takes the name of the missing constant and determines a suggested lin of code to ad to the appropriate constants validation file. * This will make it really easy for developers to maintain the constants validation system. * @param {string} inputData The name of the constant file that is missing and should have a line of code generated for it. * @param {string} inputMetaData The prefix used to reference the constants file in the code. * @return {string} The suggested line of code that should be added to the appropriate constants validation code file. * @author Seth Hollingsead * @date 2022/01/24 */ async function determineSuggestedConstantsValidationLineOfCode(inputData, inputMetaData) { let functionName = determineSuggestedConstantsValidationLineOfCode.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = ''; if (inputData && inputMetaData) { // Input: cZZTopInternationalSuccess // Output: {Name: 'cZZTopInternationalSuccess', Actual: wrd.cZZTopInternationalSuccess, Expected: 'ZZTopInternationalSuccess'} if (inputData.charAt(0) === bas.cc) { let literalValue = inputData.substring(1); // `{Name: '${inputData}', Actual: ${inputMetaData}.${inputData}, Expected: '${literalValue}'}`; returnData = bas.cOpenCurlyBrace + wrd.cName + bas.cColon + bas.cSpace + bas.cSingleQuote + inputData + bas.cSingleQuote + bas.cComa + bas.cSpace + wrd.cActual + bas.cColon + bas.cSpace + inputMetaData + bas.cDot + inputData + bas.cComa + bas.cSpace + wrd.cExpected + bas.cColon + bas.cSpace + bas.cSingleQuote + literalValue + bas.cSingleQuote + bas.cCloseCurlyBrace; } else { // Else-clause if (inputData.charAt(0) === bas.cc) // 'ERROR: Attempted to generate a suggested line of code to validate the constant, ' + // 'but the constant is not formatted correctly, it should begin with a lower case "c". ' + // 'Please reformat the constant correctly so a line of code can be generated for you.' console.log(msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage1 + msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage2 + msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage3 + msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage4 + msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage5 + msg.cDetermineSuggestedConstantsValidationLineOfCodeErrorMessage6); returnData = ''; } } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function validateConstantsDataValidationLineItemName * @description Loops through all of the constants validation data and verifies if a matching constant definition can be found, or not found. * @param {string} inputData The constant definition that should be searched for. * @param {string} inputMetaData The name of the data hive that contains the appropriate matching constants validation data. * @return {boolean} True or False to indicate if a match was found or not found. * @author Seth Hollingsead * @date 2022/01/24 */ async function validateConstantsDataValidationLineItemName(inputData, inputMetaData) { let functionName = validateConstantsDataValidationLineItemName.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = false; if (inputData && inputMetaData) { let constantNamespaceObject = await getConstantsValidationNamespaceObject(inputMetaData, ''); // constantNamespaceObject is: // await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantNamespaceObjectIs + JSON.stringify(constantNamespaceObject)); if (constantNamespaceObject) { for (const element in constantNamespaceObject) { // element is: await loggers.consoleLog(namespacePrefix + functionName, msg.celementIs + element); let validationLineItem = constantNamespaceObject[element]; // validationLineItem is: await loggers.consoleLog(namespacePrefix + functionName, msg.cvalidationLineItemIs + JSON.stringify(validationLineItem)); if (validationLineItem) { if (inputData === validationLineItem.Name) { returnData = true; break; } // End-if (inputData === validationLineItem.Name) } // End-if (validationLineItem) } // End-for (const element of constantNamespaceObject) } else { // ERROR: Unable to find the constant namespace among all the constants validation data: console.log(msg.cvalidateConstantsDataValidationLineItemNameErrorMessage1 + inputData); } } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantsValidationNamespaceParentObject * @description Searches the constants validation top-level data structure, * framework, applications, plugins for the specified namespace and returns the parent JSON object, * which contains all the meta-data necessary to generate failure messages and suggested line of code information. * @param {string} inputData The name of the constants data hive that we should search for and find as a namespace object. * @param {string} inputMetaData Not used for this business rule. * @return {object} A JSON object that contains the constants short names, file names, prefixes and file paths, * validation messages and related constants validation data. In short the constants validation parent context object. * @author Seth Hollingsead * @date 2022/12/16 */ async function getConstantsValidationNamespaceParentObject(inputData, inputMetaData) { let functionName = getConstantsValidationNamespaceParentObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = false; if (inputData) { if (await doesConstantNamespaceExist(inputData, D[sys.cConstantsValidationData][wrd.cFramework]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cFramework]; } else if (await doesConstantNamespaceExist(inputData, D[sys.cConstantsValidationData][wrd.cApplication]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cApplication]; } else { // Here we need to search through the plugins constants validation data for each plugin // to try and find the constants namespace that we are looking for! if (D[sys.cConstantsValidationData][wrd.cPlugins] && inputData.includes(bas.cColon)) { let pluginNamespaceArray = inputData.split(bas.cColon); let pluginName = pluginNamespaceArray[0]; let pluginConstantNamespace = pluginNamespaceArray[1]; for (const pluginNamespace in D[sys.cConstantsValidationData][wrd.cPlugins]) { if (pluginNamespace === pluginName && await doesConstantNamespaceExist(pluginConstantNamespace, D[sys.cConstantsValidationData][wrd.cPlugins][pluginNamespace]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cPlugins][pluginName]; } } // End-for (const pluginNamespace of D[sys.cConstantsValidationData][wrd.cPlugins]) } // End-if (D[sys.cConstantsValidationData][wrd.cPlugins]) } } // End-if (inputData) // await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantsValidationNamespaceObject * @description Searches the constants validation top-level data structure, * framework, applications, plugins for the specified namespace and returns the JSON object. * @param {string} inputData The name of the constants data hive that we should search for and find as a namespace object. * @param {string} inputMetaData Not used for this business rule. * @return {object} A JSON object that contains the constants validation data for the specified constants validation data-set, * False if nothing is found. * @author Seth Hollingsead * @date 2022/11/16 */ async function getConstantsValidationNamespaceObject(inputData, inputMetaData) { let functionName = getConstantsValidationNamespaceObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = false; if (inputData) { if (await doesConstantNamespaceExist(inputData, D[sys.cConstantsValidationData][wrd.cFramework]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cFramework][inputData]; } else if (await doesConstantNamespaceExist(inputData, D[sys.cConstantsValidationData][wrd.cApplication]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cApplication][inputData]; } else { // Here we need to search through the plugins constants validation data for each plugin // to try and find the constants namespace that we are looking for! if (D[sys.cConstantsValidationData][wrd.cPlugins] && inputData.includes(bas.cColon)) { let pluginNamespaceArray = inputData.split(bas.cColon); let pluginName = pluginNamespaceArray[0]; let pluginConstantNamespace = pluginNamespaceArray[1]; for (const pluginNamespace in D[sys.cConstantsValidationData][wrd.cPlugins]) { if (pluginNamespace === pluginName && await doesConstantNamespaceExist(pluginConstantNamespace, D[sys.cConstantsValidationData][wrd.cPlugins][pluginNamespace]) === true) { returnData = D[sys.cConstantsValidationData][wrd.cPlugins][pluginName][pluginConstantNamespace]; } } // End-for (const pluginNamespace of D[sys.cConstantsValidationData][wrd.cPlugins]) } // End-if (D[sys.cConstantsValidationData][wrd.cPlugins]) } } // End-if (inputData) // await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + JSON.stringify(returnData)); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function doesConstantNamespaceExist * @description Searches through the input data structure to determine if it contains the specified constant namespace or not. * @param {string} inputData The name of the data element that should be searched for. * @param {object} inputMetaData The data that should be searched for the specified named data parameter. * @return {boolean} True or False to indicate if a matching namespace was found in the specified data structure or not. * @author Seth Hollingsead * @date 2022/12/16 */ async function doesConstantNamespaceExist(inputData, inputMetaData) { let functionName = doesConstantNamespaceExist.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const key in inputMetaData) { // key is: await loggers.consoleLog(namespacePrefix + functionName, msg.ckeyIs + key); let element1 = inputMetaData[key]; // element1 is: await loggers.consoleLog(namespacePrefix + functionName, msg.celement1Is + JSON.stringify(element1)); if (inputData === key) { returnData = true; // Found a matching namespace constant. await loggers.consoleLog(namespacePrefix + functionName, msg.cFoundMatchingNamespaceConstant); break; } // End-if (inputData === key) } // End-for (const key in inputMetaData) } // End-if (inputData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function doesConstantExist * @description Walks through all of the constants validation files and * checks to see if any of the expected values match the string that is passed in. * @param {string} inputData The value that should be looked for in all the constants files. * @param {string} inputMetaData Not used for this business rule. * @return {boolean} True or False to indicate if a matching constant definition was found or not. * @author Seth Hollingsead * @date 2022/01/24 */ async function doesConstantExist(inputData, inputMetaData) { let functionName = doesConstantExist.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = false; if (inputData) { let frameworkConstantsValidationData = D[sys.cConstantsValidationData][wrd.cFramework]; let foundFrameworkConstantMatch = await doesConstantExistInConstantLibraryObject(inputData, frameworkConstantsValidationData); if (foundFrameworkConstantMatch === false) { let applicationConstantsValidationData = D[sys.cConstantsValidationData][wrd.cApplication]; let foundApplicationConstantMatch = await doesConstantExistInConstantLibraryObject(inputData, applicationConstantsValidationData); if (foundApplicationConstantMatch === false) { let allPluginsConstantsValidationData = D[sys.cConstantsValidationData][wrd.cPlugins]; // Now we have to go through each plugin and make a determination search for each one. if (allPluginsConstantsValidationData) { for (const pluginName in allPluginsConstantsValidationData) { // pluginName is: await loggers.consoleLog(namespacePrefix + functionName, msg.cpluginNameIs + pluginName); let pluginConstantsValidationData = allPluginsConstantsValidationData[pluginName]; let foundPluginConstantMatch = await doesConstantExistInConstantLibraryObject(inputData, pluginConstantsValidationData); if (foundPluginConstantMatch === true) { returnData = true; break; } } // End-for (const pluginName in allPluginsConstantsValidationData) } // End-if (allPluginsConstantsValidationData) } else { // Found a match with the application constants. await loggers.consoleLog(namespacePrefix + functionName, msg.cdoesConstantExistMessage01); returnData = true; } } else { // Found a match with the framework constants. await loggers.consoleLog(namespacePrefix + functionName, msg.cdoesConstantExistMessage02); returnData = true; } } // End-if (inputData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function doesConstantExistInConstantLibraryObject * @description This is a middle management of the search, walks through all of the constants validation parent collection objects, * filters out all the meta-data entries and ensures that searches are only performed on actual constants validation data values. * This function provides a re-usability function so we don't need to have repeated code in the doesConstantExist function. * @param {string} inputData The value that should be looked for in the constants validation data library, that is also provided as input. * @param {object} inputMetaData A JSON data object that contains all of the constants validation data namespace objects that should be searched. * @return {boolean} True or False to indicate if a matching constant definition was found or not. * @author Seth Hollingsead * @date 2022/12/21 */ async function doesConstantExistInConstantLibraryObject(inputData, inputMetaData) { let functionName = doesConstantExistInConstantLibraryObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const key in inputMetaData) { if (key !== sys.cConstantsShortNames && key !== sys.cConstantsFileNames && key !== sys.cConstantsPrefix && key !== sys.cConstantsFilePaths && key !== sys.cConstantsPhase1ValidationMessages && key !== sys.cConstantsPhase2ValidationMessages) { let constantValidationDataLibraryObject = inputMetaData[key]; if (await doesConstantExistInConstantNamespaceObject(inputData, constantValidationDataLibraryObject) === true) { returnData = true; break; } } // End-if (key !== sys.cConstantsShortNames && ...) } // End-for (const key in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantTypeInConstantLibraryObject * @description This is a middle management function to get the type of constant that is found. * Walks through all of the constants validation parent collection objects, * filters out all of the meta-data entries and ensures that searches are only performed on actual constants validation data values. * This function provides a re-usability function so we don't need to have repeated code in the getConstantType function. * @param {array<string,boolean>} inputData An array that contains The value that should have it's matching type returned, * and a boolean to indicate if the function should or should not continue searching for additional matches after the first match is found. * inputData[0] = The value of the constant that should be searched for to find a match and return the type. * inputData[1] = True or False value to indicate if the search should continue after finding the first match or not. * @param {object} inputMetaData A JSON data object that contains all of the constants validation data namespace objects that should be search. * @return {boolean|string} A string that contains the name of the matching constant type or False if its matching constant definition is not found. * @author Seth Hollingsead * @date 2022/12/21 */ async function getConstantTypeInConstantLibraryObject(inputData, inputMetaData) { let functionName = getConstantTypeInConstantLibraryObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const key in inputMetaData) { if (key !== sys.cConstantsShortNames && key !== sys.cConstantsFileNames && key !== sys.cConstantsPrefix && key !== sys.cConstantsFilePaths && key !== sys.cConstantsPhase1ValidationMessages && key !== sys.cConstantsPhase2ValidationMessages) { let constantValidationDataLibraryObject = inputMetaData[key]; if (await doesConstantExistInConstantNamespaceObject(inputData[0], constantValidationDataLibraryObject) === true) { if (returnData === false) { returnData = []; returnData[0] = key; } else { returnData.push(key); } if (inputData[1] === false) { break; } } // End-if (await doesConstantExistInConstantNamespaceObject(inputData[0], constantValidationDataLibraryObject) === true) } // End-if (key !== sys.cConstantsShortNames && ...) } // End-for (const key in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantNameInConstantLibraryObject * @description This is a middle management function to get the name of the constant that is found. * Walks through all of the constants validation parent collection objects, * filters out all of the meta-data entries and ensures that searches are only performed on actual constants validation data values. * This function provides a re-usability function so we don't need to have repeated code in the getConstantName function. * @param {string} inputData The value that should be looked for in the constants validation data library, that is also provided as input. * @param {object} inputMetaData A JSON data object that contains all of the constants validation data namespace objects that should be searched. * @return {string|boolean} The name of the constant if a match is found, False if no match is found. * @author Seth Hollingsead * @date 2022/12/21 */ async function getConstantNameInConstantLibraryObject(inputData, inputMetaData) { let functionName = getConstantNameInConstantLibraryObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const key in inputMetaData) { if (key !== sys.cConstantsShortNames && key !== sys.cConstantsFileNames && key !== sys.cConstantsPrefix && key !== sys.cConstantsFilePaths && key !== sys.cConstantsPhase1ValidationMessages && key !== sys.cConstantsPhase2ValidationMessages) { let constantValidationDataLibraryObject = inputMetaData[key]; let constantName = await getConstantNameInConstantNamespaceObject(inputData, constantValidationDataLibraryObject); if (constantName) { returnData = constantName; break; } } // End-if (key !== sys.cConstantsShortNames && ...) } // End-for (const key in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantActualValueInConstantLibraryObject * @description This is a middle management function to get the actual value of the constant that is found. * Walks through all of the constants validation parent collection objects, * filters out all of the meta-data entries and ensures that searches are only performed on actual constants validation data values. * This function provides a re-usability function so we don't need to have repeated code in the getConstantName function. * @param {string} inputData The value that should be looked for in the constants validation data library that is also provided as input. * @param {object} inputMetaData A JSON data object that contains all of the constants validation data namespace objects that should be searched. * @return {string|boolean} The actual value of the constant if a match is found, False if no match is found. * @author Seth Hollingsead * @date 2022/12/21 */ async function getConstantActualValueInConstantLibraryObject(inputData, inputMetaData) { let functionName = getConstantActualValueInConstantLibraryObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const key in inputMetaData) { if (key !== sys.cConstantsShortNames && key !== sys.cConstantsFileNames && key !== sys.cConstantsPrefix && key !== sys.cConstantsFilePaths && key !== sys.cConstantsPhase1ValidationMessages && key !== sys.cConstantsPhase2ValidationMessages) { let constantValidationDataLibraryObject = inputMetaData[key]; let constantName = await getConstantActualValueInConstantNamespaceObject(inputData, constantValidationDataLibraryObject); if (constantName) { returnData = constantName; break; } } // End-if (key !== sys.cConstantsShortNames && ...) } // End-for (const key in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function doesConstantExistInConstantNamespaceObject * @description Walks through all of the constants validation data inside the specified input data structure. * Checks to see if any of the expected values match the string that is passed in. * @param {string} inputData The value that should be looked for in all the constants data that is provided also as input. * @param {object} inputMetaData The constants validation data structure that should be searched. * @return {boolean} True or False to indicate if a matching constant definition was found or not. * @author Seth Hollingsead * @date 2022/12/21 */ async function doesConstantExistInConstantNamespaceObject(inputData, inputMetaData) { let functionName = doesConstantExistInConstantNamespaceObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const index in inputMetaData) { // index is: await loggers.consoleLog(namespacePrefix + functionName, msg.cindexIs + index); let constantValidationObject = inputMetaData[index]; // constantValidationObject is: await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantValidationObjectIs + JSON.stringify(constantValidationObject)); if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) { returnData = true; break; } // End-if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) } // End-for (const index in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantNameInConstantNamespaceObject * @description Walks through all of the constants validation data inside the specified input data structure. * Checks to see if any of the expected values match the string that is passed in and returns the name of a match if/when it's found. * @param {string} inputData The value that should be looked for in all the constants data that is provided also as input. * @param {object} inputMetaData The constants validation data structure that should be searched. * @return {string|boolean} The name of the constant or False if it is not found. * @author Seth Hollingsead * @date 2022/12/21 */ async function getConstantNameInConstantNamespaceObject(inputData, inputMetaData) { let functionName = getConstantNameInConstantNamespaceObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const index in inputMetaData) { // index is: await loggers.consoleLog(namespacePrefix + functionName, msg.cindexIs + index); let constantValidationObject = inputMetaData[index]; // constantValidationObject is: await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantValidationObjectIs + JSON.stringify(constantValidationObject)); if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) { returnData = constantValidationObject.Name; break; } // End-if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) } // End-for (const index in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantActualValueInConstantNamespaceObject * @description Walks through all of the constants validation data inside the specified input data structure. * Checks to see if any of the expected values match the string that is passed in and returns the actual value of a match if/when it's found. * @param {string} inputData The value that should be looked for in all the constants data that is provided also as input. * @param {object} inputMetaData The constants validation data structure that should be searched. * @return {string|boolean} The actual value of the constant or False if it is not found. * @author Seth Hollingsead * @date 2022/12/21 */ async function getConstantActualValueInConstantNamespaceObject(inputData, inputMetaData) { let functionName = getConstantActualValueInConstantNamespaceObject.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + JSON.stringify(inputMetaData)); let returnData = false; if (inputData && inputMetaData) { for (const index in inputMetaData) { // index is: await loggers.consoleLog(namespacePrefix + functionName, msg.cindexIs + index); let constantValidationObject = inputMetaData[index]; // constantValidationObject is: await loggers.consoleLog(namespacePrefix + functionName, msg.cconstantValidationObjectIs + JSON.stringify(constantValidationObject)); if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) { returnData = constantValidationObject.Actual; break; } // End-if (inputData === constantValidationObject.Actual || inputData === constantValidationObject.Name) } // End-for (const index in inputMetaData) } // End-if (inputData && inputMetaData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantType * @description Determines what constant library a particular constant is defined in. * (This will aid developers who are trying to understand & develop under this complicated constants system.) * @NOTE Just because a constant is found we do not break the loop, * but this function will report back all constants libraries where a particular constant would be defined. * Passing in a True to the inputMetaData will cause the function to exit upon first discovered match. * @param {string} inputData The string value that should be searched in all of the constants libraries. * @param {boolean} inputMetaData True or False to indicate if the function should exit on first discovery or continue to discover all possible matches. * @return {string} A list of constants libraries where the constant was found to be defined in. * @author Seth Hollingsead * @date 2022/01/24 */ async function getConstantType(inputData, inputMetaData) { let functionName = getConstantType.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = ''; if (inputData) { let frameworkConstantsValidationData = {}; let applicationConstantsValidationData = {}; let allPluginsConstantsValidationData = {}; let frameworkConstantMatchArray = []; let applicationConstantMatchArray = []; let pluginConstantMatchArray = []; frameworkConstantsValidationData = D[sys.cConstantsValidationData][wrd.cFramework]; frameworkConstantMatchArray = await getConstantTypeInConstantLibraryObject([inputData, inputMetaData], frameworkConstantsValidationData); if (frameworkConstantMatchArray && inputMetaData === false) { returnData = frameworkConstantMatchArray.join(bas.cComa); } else if (frameworkConstantMatchArray && inputMetaData === true) { returnData = frameworkConstantMatchArray[0]; } if (frameworkConstantMatchArray && frameworkConstantMatchArray.length > 0 && inputMetaData === true) { // NOTE: Normally I would not want to have multiple exit points from any function. // However, in this case I would have to craft additional logical if-conditions to prevent continued execution, // in the event that a match condition has been hit. It would add complexity to this function, and want to keep it as simple as possible. // The usage of this function is intended to be reused by the constants pattern recognizer, // so if it still needs to be done, then consider revisiting this decision at that time. await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } applicationConstantsValidationData = D[sys.cConstantsValidationData][wrd.cApplication]; applicationConstantMatchArray = await getConstantTypeInConstantLibraryObject([inputData, inputMetaData], applicationConstantsValidationData); if (applicationConstantMatchArray && inputMetaData === false) { if (returnData === '') { returnData = applicationConstantMatchArray.join(bas.cComa); } else { returnData = returnData + bas.cComa + applicationConstantMatchArray.join(bas.cComa); } } else if (applicationConstantMatchArray && inputMetaData === true) { returnData = applicationConstantMatchArray[0]; } if (applicationConstantMatchArray && applicationConstantMatchArray.length > 0 && inputMetaData === true) { await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } allPluginsConstantsValidationData = D[sys.cConstantsValidationData][wrd.cPlugins]; // Now we have to go through each plugin and make a determination search for each one. if (allPluginsConstantsValidationData) { for (const pluginName in allPluginsConstantsValidationData) { // pluginName is: await loggers.consoleLog(namespacePrefix + functionName, msg.cpluginNameIs + pluginName); let pluginConstantsValidationData = allPluginsConstantsValidationData[pluginName]; pluginConstantMatchArray = await getConstantTypeInConstantLibraryObject([inputData, inputMetaData], pluginConstantsValidationData); if (pluginConstantMatchArray && inputMetaData === false) { if (returnData === '') { returnData = pluginConstantMatchArray.join(bas.cComa); } else { returnData = returnData + bas.cComa + pluginConstantMatchArray.join(bas.cComa); } } else if (pluginConstantMatchArray && inputMetaData === true) { returnData = pluginConstantMatchArray[0] } if (pluginConstantMatchArray && pluginConstantMatchArray.length > 0 && inputMetaData === true) { await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } } // End-for (const pluginName in allPluginsConstantsValidationData) } // End-if (allPluginsConstantsValidationData) } // End-if (inputData) await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData); await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function); return returnData; } /** * @function getConstantActualValue * @description Determines the actual value of the named constant given the constant type. * @param {string} inputData The name of the constant we are looking for to get the actual value of the constant. * @param {string} inputMetaData (OPTIONAL) The type or library where the constant should be found. * @return {string} The actual value of the string. * @author Seth Hollingsead * @date 2022/01/24 */ async function getConstantActualValue(inputData, inputMetaData) { let functionName = getConstantActualValue.name; await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData); await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData); let returnData = ''; if (inputData) { if (await isConstantTypeValid(inputMetaData, '') === true) { let constantValidationNamespaceObject = await getConstantsValidationNamespaceObject(inputMetaData, ''); if (constantValidationNamespaceObject) { returnData = await getConstantActualValueInConstantNamespaceObject(inputData, constantValidationNamespaceObject); } } else { // Else-clause if (isConstantTypeValid(inputMetaData, '') === true) let frameworkConstantsValidationData = D[sys.cConstantsValidationData][wrd.cFramework]; let foundFrameworkConstantActualValue = await getC