From f260ccc8def09d4e5ca4a9d7e38d285acf86ced6 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Tue, 5 Aug 2025 16:56:38 +0330 Subject: [PATCH] refactor libraries issues for new version compiling ... --- Documents/JsModules/x-color.tools.js | 506 ------ Documents/JsModules/x-file.tools.js | 887 ---------- Documents/JsModules/x-mql-project.tools.js | 494 ------ Documents/JsModules/x-shell.tools.js | 219 --- Documents/JsModules/x-type-detector.tools.js | 268 --- Documents/JsModules/x-value.tools.js | 1528 ----------------- Documents/XCATBEAInputs/Pack 1.7z | Bin 0 -> 1075 bytes .../X121XCATBEA_DJ30_M5.x121.log copy.txt | 42 + .../X121XCATBEA_EURUSDb_M5.x121.log.txt | 42 + ...X121XCATBEA_GBPUSDb_M5.x121.log copy 7.txt | 42 + ...X121XCATBEA_NZDUSDb_M5.x121.log copy 3.txt | 42 + ...X121XCATBEA_USDCADb_M5.x121.log copy 2.txt | 42 + ...X121XCATBEA_USDCHFb_M5.x121.log copy 6.txt | 42 + ...X121XCATBEA_USDJPYb_M5.x121.log copy 5.txt | 42 + ...X121XCATBEA_XAGUSDb_M5.x121.log copy 4.txt | 42 + .../X121XCATBEA_XAUUSDb_M5.x121.log.txt | 42 + .../x-saherelm.common.extensions.lib.mq5 | 112 +- Libraries/x-saherelm.x-enums.lib.mq5 | 4 + Libraries/x-saherelm.x-ohcl.lib.mq5 | 26 +- Libraries/x-saherelm.x-poi.lib.mq5 | 40 +- Libraries/x-saherelm.x-trade.lib.mq5 | 200 ++- 21 files changed, 636 insertions(+), 4026 deletions(-) delete mode 100644 Documents/JsModules/x-color.tools.js delete mode 100644 Documents/JsModules/x-file.tools.js delete mode 100644 Documents/JsModules/x-mql-project.tools.js delete mode 100644 Documents/JsModules/x-shell.tools.js delete mode 100644 Documents/JsModules/x-type-detector.tools.js delete mode 100644 Documents/JsModules/x-value.tools.js create mode 100644 Documents/XCATBEAInputs/Pack 1.7z create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_DJ30_M5.x121.log copy.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_EURUSDb_M5.x121.log.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_GBPUSDb_M5.x121.log copy 7.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_NZDUSDb_M5.x121.log copy 3.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_USDCADb_M5.x121.log copy 2.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_USDCHFb_M5.x121.log copy 6.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_USDJPYb_M5.x121.log copy 5.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_XAGUSDb_M5.x121.log copy 4.txt create mode 100644 Documents/XCATBEAInputs/Pack 1/X121XCATBEA_XAUUSDb_M5.x121.log.txt diff --git a/Documents/JsModules/x-color.tools.js b/Documents/JsModules/x-color.tools.js deleted file mode 100644 index c3ac5f9e..00000000 --- a/Documents/JsModules/x-color.tools.js +++ /dev/null @@ -1,506 +0,0 @@ -/** - * XColor Tools Module ... - * a module for handle colorify text contents in node js ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -//#region Module Imports ... -const XValueTools = require("./x-value.tools"); -//#endregion - -// -//#region Constants ... -/** - * these are available style which can applied to an string ... - */ -const AVAILABLE_STYLES = { - // - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Underlined: "\x1b[4m", - Blink: "\x1b[5m", - ReverseFandB: "\x1b[7m", - Hidden: "\x1b[8m", - // - // Commonly used for reset all Styles ... - Reset: "\x1b[0m" -}; - -/** - * these are available foreground colors which can applied to an string ... - */ -const AVAILABLE_FOREGROUND_COLORS = { - Default: "\x1b[39m", - Black: "\x1b[30m", - Red: "\x1b[31m", - Green: "\x1b[32m", - Yellow: "\x1b[33m", - Blue: "\x1b[34m", - Magenta: "\x1b[35m", - Cyan: "\x1b[36m", - LightGray: "\x1b[37m", - DarkGray: "\x1b[90m", - LightRed: "\x1b[91m", - LightGreen: "\x1b[92m", - LightYellow: "\x1b[93m", - LightBlue: "\x1b[94m", - LightMagenta: "\x1b[95m", - LightCyan: "\x1b[96m", - White: "\x1b[97m", -}; - -/** - * these are available background colors which can applied to an string ... - */ -const AVAILABLE_BACKGROUND_COLORS = { - Default: "\x1b[49m", - Black: "\x1b[40m", - Red: "\x1b[41m", - Green: "\x1b[42m", - Yellow: "\x1b[43m", - Blue: "\x1b[44m", - Magenta: "\x1b[45m", - Cyan: "\x1b[46m", - LightGray: "\x1b[47m", - DarkGray: "\x1b[100m", - LightRed: "\x1b[101m", - LightGreen: "\x1b[102m", - LightYellow: "\x1b[103m", - LightBlue: "\x1b[104m", - LightMagenta: "\x1b[105m", - LightCyan: "\x1b[106m", - White: "\x1b[107m", -}; - -/** - * these are available style names, which exports from module and - * users can use them ... - */ -const STYLE_NAMES = { - Bold: "Bold", - Dim: "Dim", - Underlined: "Underlined", - Blink: "Blink", - ReverseFandB: "ReverseFandB", - Hidden: "Hidden", - Reset: "Reset", -}; - -/** - * these are available color names, which exports from module and - * users can use them ... - */ -const COLOR_NAMES = { - Default: "Default", - Black: "Black", - Red: "Red", - Green: "Green", - Yellow: "Yellow", - Blue: "Blue", - Magenta: "Magenta", - Cyan: "Cyan", - LightGray: "LightGray", - DarkGray: "DarkGray", - LightRed: "LightRed", - LightGreen: "LightGreen", - LightYellow: "LightYellow", - LightBlue: "LightBlue", - LightMagenta: "LightMagenta", - LightCyan: "LightCyan", - White: "White", -}; -//#endregion - -// -//#region Actions ... -/** - * apply specified style and color on a content ... - * - * @param {string} content specified content for styling ... - * @param {string} color specific color name for using to styling ... - * @param {string} style soecufic style name to use ... - * @param {boolean} toForeground apply specified color as foreground ... - * @param {boolean} toBackground apply specified color as background ... - * @returns {string} styled content ... - */ -function apply( - content, - color, - style, - toForeground = true, - toBackground = false -) { - // - let result = content; - - // - // Validate Arg ... - if (!XValueTools.isValidArg(content)) { - return result; - } - - // - // Detect and Validate Style and Apply it ... - let eStyle = AVAILABLE_STYLES[style]; - if (XValueTools.isValidArg(eStyle)) { - result = `${eStyle}${result}${AVAILABLE_STYLES.Reset}`; - } - - // - // Detect and Validate Foreground Color and Apply it ... - let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; - if ( - !!toForeground - && XValueTools.isValidArg(eFColor) - ) { - result = `${eFColor}${result}${AVAILABLE_STYLES.Reset}`; - } - - // - // Detect and Validate Background Color and Apply it ... - let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; - if ( - !!toBackground - && XValueTools.isValidArg(eBColor) - ) { - result = `${eBColor}${result}${AVAILABLE_STYLES.Reset}`; - } - -} - -/** - * apply specific style on a content ... - * - * @param {string} content specific content which going to styled ... - * @param {string} style a member of STYLE_NAMES which specified that which style going to applied to content ... - * @returns {string} styled content ... - */ -function applyStyle(content, style) { - // - // Validate Arg ... - if (!XValueTools.isValidArg(content)) { - return content; - } - - // - let eStyle = AVAILABLE_STYLES[style]; - if (eStyle === undefined) { - return content; - } - - // - return `${eStyle}${content}${AVAILABLE_STYLES.Reset}`; -} - -/** - * apply specific foreground color on a content ... - * - * @param {string} content specific content which going to colorified ... - * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... - * @returns {string} colorified content ... - */ -function applyForegroundColor(content, color) { - // - // Validate Arg ... - if (!XValueTools.isValidArg(content)) { - return content; - } - - // - let eColor = AVAILABLE_FOREGROUND_COLORS[color]; - if (eColor === undefined) { - return content; - } - - // - return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; -} - -/** - * apply specific background color on a content ... - * - * @param {string} content specific content which going to colorified ... - * @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ... - * @returns {string} colorified content ... - */ -function applyBackgroundColor(content, color) { - // - // Validate Arg ... - if (!XValueTools.isValidArg(content)) { - return content; - } - - // - let eColor = AVAILABLE_BACKGROUND_COLORS[color]; - if (eColor === undefined) { - return content; - } - - // - return `${eColor}${content}${AVAILABLE_STYLES.Reset}`; -} - -/** - * generate style and color applier expression ... - * - * @param {string} color specific color name for using to styling ... - * @param {string} style soecufic style name to use ... - * @param {boolean} reset close applier string by reset styles ... - * @param {boolean} toForeground apply specified color as foreground ... - * @param {boolean} toBackground apply specified color as background ... - * @returns {string} style and color applier string ... - */ -function getApplier( - style = "", - color = "", - reset = false, - toForeground = true, - toBackground = false -) { - // - let result = ""; - - // - // Detect and Validate Style and Apply it ... - let eStyle = AVAILABLE_STYLES[style]; - if (XValueTools.isValidArg(eStyle)) { - result = `${eStyle}`; - } - - // - // Detect and Validate Foreground Color and Apply it ... - let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; - if ( - !!toForeground - && XValueTools.isValidArg(eFColor) - ) { - result = `${eFColor}`; - } - - // - // Detect and Validate Background Color and Apply it ... - let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; - if ( - !!toBackground - && XValueTools.isValidArg(eBColor) - ) { - result = `${eBColor}`; - } - - // - if ( - !!reset && - result.length > 0 - ) { - result = `${result}${AVAILABLE_STYLES.Reset}`; - } - - // - return result; -} - -/** - * generate style applier expression ... - * - * @param {string} style soecufic style name to use ... - * @param {boolean} reset close applier string by reset styles ... - * @returns {string} style applier string ... - */ -function getStyleApplier( - style = "", - reset = false -) { - // - let result = ""; - - // - // Detect and Validate Style and Apply it ... - let eStyle = AVAILABLE_STYLES[style]; - if (XValueTools.isValidArg(eStyle)) { - result = `${eStyle}`; - } - - // - if ( - !!reset && - result.length > 0 - ) { - result = `${result}${AVAILABLE_STYLES.Reset}`; - } - - // - return result; -} - -/** - * generate color applier expression ... - * - * @param {string} color specific color name for using to styling ... - * @param {boolean} reset close applier string by reset styles ... - * @param {boolean} toForeground apply specified color as foreground ... - * @param {boolean} toBackground apply specified color as background ... - * @returns {string} color applier string ... - */ -function getColorApplier( - color = "", - reset = false, - toForeground = true, - toBackground = false -) { - // - let result = ""; - - // - // Detect and Validate Foreground Color and Apply it ... - let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; - if ( - !!toForeground - && XValueTools.isValidArg(eFColor) - ) { - result = `${eFColor}`; - } - - // - // Detect and Validate Background Color and Apply it ... - let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; - if ( - !!toBackground - && XValueTools.isValidArg(eBColor) - ) { - result = `${eBColor}`; - } - - // - if ( - !!reset && - result.length > 0 - ) { - result = `${result}${AVAILABLE_STYLES.Reset}`; - } - - // - return result; -} - -/** - * colorified specific content ... - * - * @param {string} content specified content for styling ... - * @param {string} color specific color name for using to styling ... - * @param {boolean} toForeground apply specified color as foreground ... - * @param {boolean} toBackground apply specified color as background ... - * @returns {string} - */ -function colorifyContent( - content = "", - color = "", - toForeground = true, - toBackground = false -) { - // - let result = content; - - // - if (!XValueTools.isValidArg(content)) { - return result; - } - - // - // Finde Colors ... - - // - // Detect and Validate Foreground Color and Apply it ... - let eFColor = AVAILABLE_FOREGROUND_COLORS[color]; - if ( - !!toForeground - && XValueTools.isValidArg(eFColor) - ) { - result = `${eFColor}${result}`; - } - - // - // Detect and Validate Background Color and Apply it ... - let eBColor = AVAILABLE_BACKGROUND_COLORS[color]; - if ( - !!toBackground - && XValueTools.isValidArg(eBColor) - ) { - result = `${eBColor}${result}`; - } - - // - if ( - result.length > 0 - && ( - XValueTools.isValidArg(eFColor) || - XValueTools.isValidArg(eBColor) - ) - ) { - result = `${result}${AVAILABLE_STYLES.Reset}`; - } - - // - return result; -} - -/** - * apply style on specific content ... - * - * @param {string} content specified content for styling ... - * @param {string} style soecufic style name to use ... - * @returns {string} - */ -function stylifiyContent( - content = "", - style = "", -) { - // - let result = content; - - // - if (!XValueTools.isValidArg(content)) { - return result; - } - - // - // Detect and Validate Style and Apply it ... - let eStyle = AVAILABLE_STYLES[style]; - if (XValueTools.isValidArg(eStyle)) { - result = `${eStyle}${result}`; - } - - // - if ( - result.length > 0 - && XValueTools.isValidArg(eStyle) - ) { - result = `${result}${AVAILABLE_STYLES.Reset}`; - } - - // - return result; -} -//#endregion - -// -//#region Module Exports ... -module.exports = { - // - STYLE_NAMES, - COLOR_NAMES, - // - apply, - applyStyle, - getApplier, - getColorApplier, - getStyleApplier, - colorifyContent, - stylifiyContent, - applyForegroundColor, - applyBackgroundColor, -} -//#endregion \ No newline at end of file diff --git a/Documents/JsModules/x-file.tools.js b/Documents/JsModules/x-file.tools.js deleted file mode 100644 index 2a3535df..00000000 --- a/Documents/JsModules/x-file.tools.js +++ /dev/null @@ -1,887 +0,0 @@ -/** - * XFile Tools Module ... - * a module for handle all file/folder manipulating task in node js ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -//#region Module Imports ... -const fs = require('fs'); -const os = require('os'); -const Path = require('path'); -const http = require('http'); -const https = require('https'); -const XValueTools = require('./x-value.tools'); -//#endregion - -// -//#region Constants ... -/** - * current os path separators ... - */ -const PathSeparator = Path.sep; - -/** - * current directory ... - */ -const CurrentDir = __dirname; -//#endregion - -// -//#region Actions ... -// -//#region Global ... -/** - * retrieve a path status ... - * - * @param {string} path a path value to check ... - * @returns an stat object ... - */ -function getStatus(path = '') { - // - if (!XValueTools.isValidArg(path)) { - return undefined; - } - - // - return fs.statSync(path); -} - -/** - * retrieve user's Home path ... - * - * @returns {string} a path ... - */ -function getHomePath() { - return os.homedir(); -} -//#endregion - -// -//#region Path ... -/** - * retrieve the base name of specific address path ... - * - * @param {string} path address of file or folder ... - * @returns string ... - */ -function basename(path = '') { - // - if (!XValueTools.isValidArg(path)) { - return ''; - } - - // - const result = Path.basename(path); - return result; -} - -/** - * join several path segments together ... - * - * @param {...string} path path params ... - * @returns a joined paths ... - */ -function joinPath(...path) { - return Path.join(...path); -} - -/** - * resolve a relative path to absolute ... - * - * @param {string[]} path a path value to check ... - * @returns {string} - */ -function resolvePath(...path) { - return Path.resolve(...path); -} -//#endregion - -// -//#region File ... -/** - * determines a path destination is a file or not ... - * - * @param {string} path a path value to check ... - * @returns a boolean value ... - */ -function isFileExists(path = '') { - // - if (!XValueTools.isValidArg(path)) { - return false; - } - - // - try { - const stat = getStatus(path); - if (!stat) { - return false; - } - - // - return stat.isFile(); - } catch { - return false; - } -} - -/** - * remove a file ... - * - * @param {string} path a file path ... - * @returns {Promise} action done or not ... - */ -function removeFile(path = '') { - return new Promise((resolve) => { - // - if (!isFileExists(path)) { - resolve(false); - } - - // - fs.unlink(path, (err) => { - // - if (err) { - resolve(false); - return; - } - - // - resolve(true); - }); - }); -} - -/** - * copy a file to destination path ... - * - * @param {string} source source file path ... - * @param {string} dest dest folder path ... - * @returns {Promise} action done or not ... - */ -function copyFile( - source = '', - dest = '' -) { - return new Promise((resolve) => { - // - if ( - !isFileExists(source) || - !isDirectoryExists(dest) - ) { - resolve(false); - return; - } - - // - const destFilePath = Path.join(dest, Path.basename(source)); - fs.copyFile(source, destFilePath, (err) => { - // - if (err) { - resolve(false); - return; - } - - // - resolve(true); - }); - }); -} - -/** - * reading specified file content ... - * - * @param {string} path a file path ... - * @returns {Promise} file content ... - */ -function readFile(path = '') { - return new Promise((resolve) => { - // - if (!isFileExists(path)) { - resolve(''); - return; - } - - // - fs.readFile(path, 'utf8', (err, content) => { - // - if (err) { - resolve(undefined); - return; - } - - // - resolve(content); - }); - }); -} - -/** - * write content to a file ... - * - * @param {string} path a file path ... - * @param {string} content the content which going to write to the file ... - * @param {bool} overwrite determines file overwrite if exists ... - * @returns {Promise} action done or not ... - */ -function writeFile( - path = '', - content = '', - overwrite = true -) { - return new Promise((resolve) => { - // - if (isFileExists(path) && !overwrite) { - // - resolve(false); - return; - } - - // - // Normalize Content ... - content = XValueTools.isValidArg(content) ? - content : - ''; - - // - fs.writeFile(path, content, (err) => { - // - if (err) { - // - resolve(false); - return; - } - - // - resolve(true); - }); - }); -} - -/** - * create a file ... - * - * @param {string} path file path ... - * @param {string} fileName file name ... - * @returns {Promise} action done or not ... - */ -function createFile( - path = '', - fileName = '' -) { - return new Promise((resolve) => { - // - const filePath = Path.join(path, fileName); - if ( - isFileExists(filePath) || - !XValueTools.isValidArg(path) || - !XValueTools.isValidArg(fileName) - ) { - // - resolve(false); - return; - } - - // - fs.writeFile(filePath, '', (err) => { - // - if (err) { - // - resolve(false); - return; - } - - // - resolve(true); - }); - }); -} - -/** - * remove a file name extension ... - * - * @param {string} name - * @returns {string} name without extension ... - */ -function removeFileExtension(name = '') { - return name.substring(0, name.lastIndexOf('.')) || name; -} - -/** - * retrieve a file extension ... - * - * @param {string} path a path which locate a file ... - * @returns {string} - */ -function getFileExtension(path = '') { - // - let result = ""; - - // - // Validate Arg ... - if ( - !XValueTools.isValidArg(path) - || !isFileExists(path) - ) { - return result; - } - - // - // Retrieve just file name ... - const fileName = basename(path); - result = fileName.replace( - removeFileExtension(fileName), - "" - ); - - // - return result; -} - -/** - * retrieve all files list recursively from specific path ... - * - * @param {string} path a source folder path ... - * @param {string[]} extensions which file extensions need to be listed, live empty for all files ... - * @returns {Promise} - */ -async function getRecursiveFilesList( - path = "", - extensions = [] -) { - // - let result = []; - - // - // Validate Args ... - if ( - !XValueTools.isValidArg(path) - || !isDirectoryExists(path) - ) { - return result; - } - - // - const contents = await getDirectoryContents(path); - for (const item of contents) { - // - const itemPath = joinPath( - path, - item - ); - - // - const isItemFile = isFileExists(itemPath); - if (isItemFile) { - // - const itemFileExtension = getFileExtension(itemPath); - const isFileInSupportedExtensions = - extensions === undefined || extensions.length === 0 - ? true - : extensions.includes(itemFileExtension) - ; - if (isFileInSupportedExtensions) { - result.push(itemPath); - } - } else if (isDirectoryExists(itemPath)) { - // - const itemPathFiles = await getRecursiveFilesList(itemPath, extensions); - result.push(...itemPathFiles); - } - } - - // - return result; -} - -/** - * Extract Specific files from a folder and it's content ... - * - * @param {string} path Folder Path ... - * @returns - */ -async function extractFiles(path = "", ext = [], excludeWorkspaceFolders = []) { - // - const result = []; - - // - if (!ext || ext.length == 0) { - return result; - } - - // - const pathContent = await getDirectoryContents(path); - if (!pathContent || pathContent.length == 0) { - return result; - } - - // - // Loop through Content ... - for (const c of pathContent) { - // - // Prepare full path ... - const cPath = joinPath(path, c); - - // - // check content path is file or not ... - const isCFile = isFileExists(cPath); - const isCDirectory = isDirectoryExists(cPath); - if (isCFile) { - // - // Check it is MQL file or not ... - const cExt = getFileExtension(cPath); - if (ext.includes(cExt)) { - result.push(cPath); - } - } else if (isCDirectory) { - // - const destFolderName = basename(cPath); - const isExcluded = excludeWorkspaceFolders.includes(destFolderName); - if (isExcluded) { - continue; - } - - // - const cFiles = await extractFiles(cPath, ext); - if (cFiles && cFiles.length > 0) { - result.push(...cFiles); - } - } - } - - // - return result; -} -//#endregion - -// -//#region Directory ... -/** - * create a directory ... - * - * @param {string} path destination path including dir name ... - * @param {boolean} recursive create directories recursively ... - * @returns action done or not ... - */ -function createDirectory( - path = '', - recursive = true -) { - // - let result = false; - - // - if ( - isDirectoryExists(path) || - !XValueTools.isValidArg(path) - ) { - return false; - } - - // - try { - // - fs.mkdirSync(path, { recursive: recursive }); - result = true; - return result; - } catch { - return false; - } -} - -/** - * remove a directory ... - * - * @param {string} path destination path including dir name ... - * @param {boolean} recursive removes directories recursively ... - * @returns {Promise} action done or not ... - */ -function removeDirectory( - path = '', - recursive = false -) { - return new Promise((resolve) => { - // - if (!isDirectoryExists(path)) { - resolve(false); - return; - } - - // - fs.rm(path, { - recursive - }, (err) => { - // - if (err) { - resolve(false); - return; - } - - // - resolve(true); - }); - }); -} - -/** - * determines a path destination is a directory or not ... - * - * @param {string} path a folder path ... - * @returns represent destnation path is Directory or not ... - */ -function isDirectoryExists(path = '') { - // - if (!XValueTools.isValidArg(path)) { - return false; - } - - // - try { - // - const isExists = fs.existsSync(path); - if (!isExists) { - return false; - } - - // - const stat = getStatus(path); - if (!stat) { - return false; - } - - // - const result = stat.isDirectory(); - return result; - } catch { - return false; - } -} - -/** - * retrieve a directory content ... - * - * @param {string} path a folder path ... - * @returns {Promise} a collection of folder files ... - */ -function getDirectoryContents(path = '') { - return new Promise((resolve) => { - // - if (!isDirectoryExists(path)) { - resolve([]); - return; - } - - // - fs.readdir(path, (err, content) => { - // - if (err) { - resolve([]); - return; - } - - // - resolve(content); - }); - }); -} - -/** - * retrieve a directory files ... - * - * @param {string} path a folder path ... - * @returns {Promise} a collection of folder files ... - */ -function getDirectoryFiles( - path = '', - containsHiddenFiles = false -) { - return new Promise((resolve) => { - // - if (!isDirectoryExists(path)) { - resolve([]); - return; - } - - // - fs.readdir(path, (err, content) => { - // - if (err) { - resolve([]); - return; - } - - // - if (!containsHiddenFiles) { - content = content.filter(c => !c.startsWith('.')); - } - - // - const result = []; - content - .forEach(c => { - // - const cPath = Path.join(path, c); - if (isFileExists(cPath)) { - result.push(c); - } - }); - - // - resolve(result); - }); - }); -} - -/** - * retrieve a directory folders ... - * - * @param {string} path a folder path ... - * @returns {Promise} a collection of folder names ... - */ -function getDirectoryFolders(path = '') { - return new Promise((resolve) => { - // - if (!isDirectoryExists(path)) { - resolve([]); - return; - } - - // - fs.readdir(path, (err, content) => { - // - if (err) { - resolve([]); - return; - } - - // - const result = []; - content.forEach(c => { - // - const cPath = Path.join(path, c); - if (isDirectoryExists(cPath)) { - result.push(c); - } - }); - - // - resolve(result); - }); - }); -} - -/** - * copy a folder with all of it's content to dest ... - * - * @param {string} source source folder path ... - * @param {string} dest dest folder path ... - * @returns {Promise} action done or not ... - */ -async function copyFolder( - source = '', - dest = '' -) { - // - if ( - !isDirectoryExists(source) || - !XValueTools.isValidArg(dest) || - !XValueTools.isValidArg(source) - ) { - return false; - } - - // - const folderName = Path.basename(source); - const destPath = Path.join(dest, folderName); - - // - // Create Dest Path folder if not exists ... - if (!isDirectoryExists(destPath)) { - // - let result = createDirectory(destPath, true); - if (!result) { - return false; - } - } - - // - // Files ... - const files = await getDirectoryFiles(source); - if (files && files.constructor === Array && files.length > 0) { - // - const filesPromises = files.map(file => copyFile(Path.join(source, file), destPath)); - const filesResult = (await Promise.all(filesPromises)).every(r => !!r); - if (!filesResult) { - return false; - } - } - - // - // Folders ... - const folders = await getDirectoryFolders(source); - if (folders && folders.constructor === Array && folders.length > 0) { - // - const folderPromises = folders.map(folder => copyFolder(Path.join(source, folder), destPath)); - const filesResult = (await Promise.all(folderPromises)).every(r => !!r); - if (!filesResult) { - return false; - } - } - - // - return true; -} -//#endregion - -// -//#region Downloader ... -/** - * download a file from specific url and store it ... - * - * @param {string} filepath the file name and path which required to put download file on it ... - * @param {string} url the web url for downloading ... - */ -function download(filepath, url) { - // - // Validate Args ... - if ( - !XValueTools.isValidArg(url) - || !XValueTools.isValidURL(url) - || !XValueTools.isValidArg(filepath) - ) { - return; - } - - // - var file = fs.createWriteStream(filepath); - - // - if (url.startsWith('https:')) { - https.get(url, function (response) { - response.pipe(file); - }); - } else if (url.startsWith('http:')) { - http.get(url, function (response) { - response.pipe(file); - }); - } -} -//#endregion - -// -//#region JSON ... -/** - * read and parse a JSON content from a file ... - * - * @param {string} path source file path ... - * @returns {any} - */ -function readJSON(path = "") { - // - // Validate Args ... - if (!isFileExists(path)) { - return undefined; - } - - // - let result = undefined; - try { - result = require(path); - } catch { - result = undefined; - } - - // - return result; -} - -/** - * write a JSON Object content into a file ... - * - * @param {string} path dest file path ... - * @param {any} content an object which required to write to file ... - * @returns {Promise} - */ -async function writeJSON( - path = "", - content = undefined -) { - // - let result = false; - - // - // Validate Args ... - if (!XValueTools.isValidArg(path)) { - return result; - } - - // - // Normallize Content ... - if (content === undefined) { - content = {}; - } - - // - const contentString = XValueTools.beautifyJSON(content); - - // - result = await writeFile( - path, - contentString, - true - ); - - // - return result; -} -//#endregion -//#endregion - -// -//#region Module Exports ... -module.exports = { - // - CurrentDir, - PathSeparator, - - // - getStatus, - getHomePath, - - // - basename, - joinPath, - resolvePath, - - // - download, - - // - readJSON, - writeJSON, - - // - copyFile, - readFile, - writeFile, - createFile, - removeFile, - isFileExists, - getFileExtension, - removeFileExtension, - getRecursiveFilesList, - extractFiles, - - // - copyFolder, - createDirectory, - removeDirectory, - isDirectoryExists, - getDirectoryFiles, - getDirectoryFolders, - getDirectoryContents, -}; -//#endregion \ No newline at end of file diff --git a/Documents/JsModules/x-mql-project.tools.js b/Documents/JsModules/x-mql-project.tools.js deleted file mode 100644 index 4a507a48..00000000 --- a/Documents/JsModules/x-mql-project.tools.js +++ /dev/null @@ -1,494 +0,0 @@ -/** - * XProject Tools Module ... - * a module for handle MQL5 Projects Compile and Packing ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -// Import Requirements ... -const execSync = require("child_process").execSync; -const XFileTools = require("./Documents/JsModules/x-file.tools"); -const XShellTools = require("./Documents/JsModules/x-shell.tools"); -const XColorTools = require("./Documents/JsModules/x-color.tools"); -const XTypeTools = require("./Documents/JsModules/x-type-detector.tools"); - -// -// Definitions ... -const packsPath = XFileTools.joinPath(".", "Packs"); -const workspacePaths = [ - "Classes", // Required Classes - "Experts", // Expert Advisers - "Helpers", // Indicator's Helpers Classes - "Indicators", // Required Indicators - "Libraries", // Required Libraries - "XCATBEA", // XCATBEA Projects ... -]; - -// -//#region Tools ... - -/** - * Handle Compile and Pack Projects ... - * - * @param {string} projectName - * @param {string[]} resources - * @param {boolean} forceCleanup - * @param {boolean} forceCompileIndicators - */ -async function prepareProject( - projectName = "", - resources = [], - forceCleanup = true, - forceCompileIndicators = true -) { - // - // Check Resources Has Child ... - let isValidArgs = - resources.length > 0 && - XTypeTools.isArray(resources); - if (!isValidArgs) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Invalid Resource List ...", XColorTools.COLOR_NAMES.Red) - ); - } - - // - // Check Project Name is Valid ... - isValidArgs = - projectName.length > 0 && - XTypeTools.isString(projectName); - if (!isValidArgs) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Empty Project Name ...", XColorTools.COLOR_NAMES.Red) - ); - } - - // - // Extract Required to Compile Resources List ... - let compileList = await extractResources(resources, true); - if (!compileList || compileList.length == 0) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Resource List Extraction to Compile Failed ...", XColorTools.COLOR_NAMES.Red) - ); - - // - return; - } - - // - // Compile Resources Files ... - for (const f of compileList) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("try to Compile: ", XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue) - ); - - // - await recursiveTriesToCompileFile(f, 0); - } - - // - // Extract Required to Pack Resources List ... - let packList = await extractResources(resources, false); - if (!packList || packList.length == 0) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Resource List Extraction to Pack Failed ...", XColorTools.COLOR_NAMES.Red) - ); - - // - return; - } - - // - // Prepare Pack Folder Exists ... - let isExists = XFileTools.isDirectoryExists(packsPath); - if (!isExists) { - XFileTools.createDirectory(packsPath); - } - - // - // Check Folder Exists or not ... - // if Exists Remove it ... - // Create Project Folder on Packs ... - const prjFolderOnPacks = XFileTools.joinPath(packsPath, projectName); - isExists = XFileTools.isDirectoryExists(prjFolderOnPacks); - if (isExists) { - await XFileTools.removeDirectory(prjFolderOnPacks, true); - } - XFileTools.createDirectory(prjFolderOnPacks); - - // - // Loop through Files ... - for (const f of packList) { - // - // Prepare Destination Path ... - const fBasePath = XFileTools.basename(f); - let fDestPath = f.replace(fBasePath, ""); - fDestPath = fDestPath.substring(0, fDestPath.length - 1); - fDestPath = XFileTools.joinPath(prjFolderOnPacks, fDestPath); - - // - const isFDestPathExists = XFileTools.isDirectoryExists(fDestPath); - if (!isFDestPathExists) { - XFileTools.createDirectory(fDestPath); - } - - // - // Log ... - console.log( - XColorTools.applyForegroundColor("try to copy: ", XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue), - XColorTools.applyForegroundColor(" to : ", XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(fDestPath, XColorTools.COLOR_NAMES.Magenta) - ); - - // - let result = await XFileTools.copyFile(f, fDestPath); - if (result) { - // - const msg = "copy successfully ..."; - console.log( - XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Green) - ); - } else { - // - const msg = "copy failed ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red)); - throw msg; - } - } - - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Project: ", XColorTools.COLOR_NAMES.Green), - XColorTools.applyForegroundColor(projectName, XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(" Compiled and Packed Successfully ...", XColorTools.COLOR_NAMES.Green), - ); - - // - // Cleanup WorkSpace if Provided ... - if (forceCleanup) { - await cleanupWorkSpace(); - } - - // - // Compile Indicators ... - if (forceCompileIndicators) { - await compile("Indicators"); - } -} - -/** - * Extract required Files List ... - * - * @param {boolean} forCompile - * - * @returns Promise - */ -async function extractResources( - resources = [], - forCompile = true -) { - // - let result = []; - - // - // Loop Through Project Resources and Extract Files List to Compile ... - for (const resource of resources) { - // - // Prepare Normalized Resource Path ... - let resourcePath = XFileTools.joinPath(".", resource); - - // - // Handle Wild Card Resources ... - if (resourcePath.endsWith("//*") || - resourcePath.endsWith("\\*")) { - // - resourcePath = resourcePath.substring(0, resourcePath.length - 2); - const files = await XFileTools.extractFiles( - resourcePath, - forCompile ? [".mq5", ".mq4"] : [".ex5", ".ex4"] - ); - - // - result = result.concat(files); - } - // - // Handle Direct File Resources ... - else { - // - // Check MQL 5 Version ... - let fileResourcePath = resourcePath + (forCompile ? ".mq5" : ".ex5"); - - // - // Check File Exists ... - let isExists = XFileTools.isFileExists(fileResourcePath); - if (!isExists) { - // - // Check MQL 4 Version ... - fileResourcePath = resourcePath + (forCompile ? ".mq4" : ".ex4"); - isExists = XFileTools.isFileExists(fileResourcePath); - } - - // - // Add File Path to Files List if Exists ... - if (isExists) { - result.push(fileResourcePath); - } - } - } - - // - return result; -} - -/** - * try to compile a file ... - * @param {string} f - * @param {number} numberOfTries - */ -async function recursiveTriesToCompileFile(f = "", numberOfTries = 0) { - // - let result = await handleFileCompile(f); - if (result) { - // - const msg = "compiled successfully ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Green)); - return result; - } else { - // - if (numberOfTries < 10) { - // - numberOfTries++; - - // - const msg = "retry (" + (numberOfTries + 1) + ") ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.LightMagenta)); - await recursiveTriesToCompileFile(f, numberOfTries); - } else { - // - const msg = "failed ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red)); - throw msg; - - // - return false; - } - } -} - -/** - * execute compile task on Specific File ... - * @param {string} f file path to Execute Compile task ... - * @returns - */ -async function handleFileCompile(f = "") { - // - let result = false; - - // - let exResult = await compileMQLFile(f); - if (exResult.includes("0 errors")) { - result = true; - } else { - result = false; - } - - // - return result; -} - -/** - * Compile Specific MQL File ... - * - * @param {string} path MQL file path ... - * @returns - */ -async function compileMQLFile(path = "") { - // - // Check File Exists ... - const isExists = XFileTools.isFileExists(path); - if (!isExists) { - // - const msg = "file not found ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red)); - throw msg; - } - - // - const ext = XFileTools.getFileExtension(path); - if (ext !== ".mq5" && ext !== "mq4") { - // - const msg = "invalid file extension ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red)); - throw msg; - } - - // - const cwd = __dirname; - const cmd = "compile.cmd " + path; - - // - const result = await XShellTools.execute(cmd, cwd); - return result; -} - -/** - * Run Specified Command in workspace ... - * - * @param {string} cmd - * @returns - */ -async function runCommand(cmd = "") { - // - // Validate Args ... - let isValidArgs = cmd.length > 0 && - XTypeTools.isString(cmd); - - // - // Validate Commands ... - if (isValidArgs) { - // - // Check Available Commands ... - isValidArgs = - cmd === "*" || - cmd === "cleanup" || - workspacePaths.includes(cmd) || - workspacePaths.map(x => x.toLowerCase(x)).includes(cmd.toLowerCase()); - } - if (!isValidArgs) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Invalid Command ...", XColorTools.COLOR_NAMES.Red) - ); - } - - // - // Compile ... - if (cmd == "*") { - await compileWorkSpace(); - } else if (cmd == "cleanup") { - await cleanupWorkSpace(); - } else { - // - // Select Workspace to Compile ... - const folder = workspacePaths - .find(x => x.toLowerCase() === cmd.toLowerCase()); - isValidArgs = - XTypeTools.isString(folder) && - folder.length > 0; - if (!isValidArgs) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Invalid Command ...", XColorTools.COLOR_NAMES.Red) - ); - } - - // - // Extract Required to Compile Resources List ... - let compileList = await XFileTools.extractFiles( - folder, - [".mq5", ".mq4"] - ); - if (!compileList || compileList.length == 0) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("Extraction to Compile Failed ...", XColorTools.COLOR_NAMES.Red) - ); - - // - return; - } - - // - // Compile Resources Files ... - for (const f of compileList) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("try to Compile: ", XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue) - ); - - // - await recursiveTriesToCompileFile(f, 0); - } - } -} - -/** - * Cleanup Workspace compiled files ... - */ -async function cleanupWorkSpace() { - // - for (const path of workspacePaths) { - // - const fSourcePath = XFileTools.joinPath(".", path); - const filesToRemove = await XFileTools.extractFiles(fSourcePath, [".ex5", ".ex4"]); - for (const f of filesToRemove) { - // - // Log ... - console.log( - XColorTools.applyForegroundColor("try to Remove: ", XColorTools.COLOR_NAMES.Yellow), - XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue) - ); - - // - let result = await XFileTools.removeFile(f); - if (result) { - // - const msg = "removed successfully ..."; - console.log( - XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Green) - ); - } else { - // - const msg = "removed failed ..."; - console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red)); - throw msg; - } - } - } -} - -/** - * Compile Workspace ... - */ -async function compileWorkSpace() { - // - for (const path of workspacePaths) { - await runCommand(path); - } -} -//#endregion - -// -//#region Module Exports ... -module.exports = { - extractResources, - recursiveTriesToCompileFile, - handleFileCompile, - compileMQLFile, - runCommand, - cleanupWorkSpace, - compileWorkSpace, - prepareProject -} -//#endregion \ No newline at end of file diff --git a/Documents/JsModules/x-shell.tools.js b/Documents/JsModules/x-shell.tools.js deleted file mode 100644 index 0ee13de9..00000000 --- a/Documents/JsModules/x-shell.tools.js +++ /dev/null @@ -1,219 +0,0 @@ -/** - * XShell Tools Module ... - * a module for handling shell actions and retrieve OS Info in node js ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -//#region Imports ... -const os = require('os'); -const process = require('process'); -const { exec } = require("child_process"); -const XFileTools = require('./x-file.tools'); -//#endregion - -// -//#region Constants ... -// -const OS = { - Aix: 'aix', - Darwin: 'darwin', - FreeBSD: 'freebsd', - Linux: 'linux', - OpenBSD: 'openbsd', - SnOS: 'sunos', - Windows: 'win32' -}; - -// -const isWindows = process.platform === OS.Windows; -//#endregion - -// -//#region Actions ... -// -//#region Pure shell commands ... -/** - * execute a command using NodeJS on shell ... - * - * @param {string} cmd command to execute ... - * @param {string} cwd working directory ... - * - * @returns Promise instance ... - */ -function execute(cmd, cwd) { - return new Promise((resolve, reject) => { - // - if (!cmd || cmd.toString().length === 0 || (cwd && !XFileTools.isDirectoryExists(cwd))) { - reject('invalid args ...'); - return; - } - - // - exec(cmd, { cwd }, (err, result, stdError) => { - // - if (err) { - reject(err); - return; - } - - // - if (stdError) { - // - // reject(stdError); - // return; - } - - // - resolve(result); - }); - }); -}; - -/** - * determines a command exists on host or not ... - * - * @param {string} name specific command name ... - * - * @returns boolean Promise ... - */ -function checkCommandExists(name) { - return new Promise(resolve => { - // - if (!name) { - resolve(false); - return; - } - - // - const cmd = isWindows ? `${name} >nul 2>&1` : `type ${name} >/dev/null 2>&1`; - execute(cmd).then(result => { - resolve(true); - }) - .catch(err => { - resolve(false); - }); - }); -} -//#endregion - -// -//#region required commands state ... -/** - * check al required commands exists or not ... - * - * @returns - */ -async function isRequiredCommandsExists() { - // - let result = false; - - // - // const isTarExists = await isTarCommandExists(); - // const isCatExists = await isCatCommandExists(); - // const isGrepExists = await isGrepCommandExists(); - // const isSedExists = await isSedCommandExists(); - const isNpmExists = await isNpmCommandExists(); - const isNgExists = await isNgCommandExists(); - const isIonicExists = await isIonicCommandExists(); - const isCordovaExists = await isCordovaCommandExists(); - - // - result = isNpmExists - && isNgExists - && isIonicExists - && isCordovaExists - ; - - // - return result; -} - -/** - * retrieve required commands state object ... - * - * @returns - */ -async function getRequiredCommandsStates() { - // - const result = {}; - - // - // const isTarExists = await isTarCommandExists(); - // const isCatExists = await isCatCommandExists(); - // const isGrepExists = await isGrepCommandExists(); - // const isSedExists = await isSedCommandExists(); - const isNpmExists = await isNpmCommandExists(); - const isNgExists = await isNgCommandExists(); - const isIonicExists = await isIonicCommandExists(); - const isCordovaExists = await isCordovaCommandExists(); - - // - result['npm'] = isNpmExists; - result['ng'] = isNgExists; - result['ionic'] = isIonicExists; - result['cordova'] = isCordovaExists; - - // - return result; -} -//#endregion - -// -//#region Commonly used Command Checkers ... -/** - * determines npm command exists or not ... - * - * @returns - */ -function isNpmCommandExists() { - return checkCommandExists('npm'); -} - -/** - * determines ng command exists or not ... - * - * @returns - */ -function isNgCommandExists() { - return checkCommandExists('ng'); -} - -/** - * determines ionic command exists or not ... - * - * @returns - */ -function isIonicCommandExists() { - return checkCommandExists('ionic'); -} - -/** - * determines cordova command exists or not ... - * - * @returns - */ -function isCordovaCommandExists() { - return checkCommandExists('cordova'); -} -//#endregion -//#endregion - -// -//#region Module Exports ... -module.exports = { - // - execute, - checkCommandExists, - isRequiredCommandsExists, - getRequiredCommandsStates, - - // - isNgCommandExists, - isIonicCommandExists, - isCordovaCommandExists, -} -//#endregion \ No newline at end of file diff --git a/Documents/JsModules/x-type-detector.tools.js b/Documents/JsModules/x-type-detector.tools.js deleted file mode 100644 index 86ed3d80..00000000 --- a/Documents/JsModules/x-type-detector.tools.js +++ /dev/null @@ -1,268 +0,0 @@ -/** - * DataType Tools Module ... - * a module for manipulate and detect supported data types in node js ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -//#region Constants ... -/** - * all supported data types ... - */ -const DataTypes = { - Null: 'null', - Date: 'date', - Array: 'array', - Object: 'object', - String: 'string', - Number: 'number', - Unknown: 'unknown', - Boolean: 'boolean', - Function: 'function', - Undefined: 'undefined', -}; -//#endregion - -// -//#region Actions ... -/** - * detect type of a content ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function getType(value) { - // - const type = typeof value; - - // - let result = DataTypes.Unknown; - let dateIdentifier = '[object Date]'; - let constructor = value && value.constructor ? - value.constructor.toString() : - ''; - - // - switch (type) { - // - case 'undefined': - result = DataTypes.Undefined; - break; - - // - case 'boolean': - result = DataTypes.Boolean; - break; - - // - case 'string': - result = DataTypes.String; - break; - - // - case 'number': - result = DataTypes.Number; - break; - - // - case 'function': - result = DataTypes.Function; - break; - - // - case 'object': - // - // Null ... - if (value === null) { - result = DataTypes.Null; - } else - // - // Array ... - if (Array.isArray(value)) { - result = DataTypes.Array; - } else - // - // Data ... - if ( - value instanceof Date || - isFunction(value.getMonth) || - constructor.includes(dateIdentifier) || - Object.prototype.toString.call(value) === dateIdentifier - ) { - result = DataTypes.Date; - } else - // - // Object ... - { - result = DataTypes.Object; - } - break; - - // - default: - result = DataTypes.Unknown; - break; - } - - // - return result; -} - -/** - * retrieve an object constructor ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function getConstructor(value) { - // - const result = value && value.constructor ? - value.constructor.toString() : - ''; - - // - return result; -} - -/** - * retrieve an object prototype ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function getPrototype(value) { - // - const result = value ? - Object.prototype.toString.call(value) : - ''; - - // - return result; -} - -/** - * check an object is null or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isNull(value) { - return getType(value) === DataTypes.Null; -} - -/** - * check an object is undefined or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isUndefined(value) { - return getType(value) === DataTypes.Undefined; -} - -/** - * check an object is null or undefined or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isNullOrUndefined(value) { - return isNull(value) || isUndefined(value); -} - -/** - * check an object is a date or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isDate(value) { - return getType(value) === DataTypes.Date; -} - -/** - * check an object is number or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isNumber(value) { - return getType(value) === DataTypes.Number; -} - -/** - * check an object is string or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isString(value) { - return getType(value) === DataTypes.String; -} - -/** - * check an object is boolean or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isBoolean(value) { - return getType(value) === DataTypes.Boolean; -} - -/** - * check an object is an Array or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isArray(value) { - return getType(value) === DataTypes.Array; -} - -/** - * check an object is and Object or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isObject(value) { - return getType(value) === DataTypes.Object; -} - -/** - * check an object is a Function or not ... - * - * @param {any} value the content which going to check ... - * @returns - */ -function isFunction(value) { - return getType(value) === DataTypes.Function; -} -//#endregion - -// -//#region Module Exports ... -module.exports = { - // - DataTypes, - - // - getType, - getConstructor, - getPrototype, - isNull, - isUndefined, - isNullOrUndefined, - isDate, - isNumber, - isString, - isBoolean, - isArray, - isObject, - isFunction, -} -//#endregion \ No newline at end of file diff --git a/Documents/JsModules/x-value.tools.js b/Documents/JsModules/x-value.tools.js deleted file mode 100644 index 81cfcc4b..00000000 --- a/Documents/JsModules/x-value.tools.js +++ /dev/null @@ -1,1528 +0,0 @@ -/** - * Value Tools Module ... - * a module for Validate args and values ... - * - * Maintainer - * - * Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) - */ - -// -//#region Imports ... -const XTypeTools = require('./x-type-detector.tools'); -//#endregion - -// -//#region Actions ... -/** -* validate a value as an argument ... -* -* @param {string} value the value which going to validate ... -* @returns -*/ -function isValidArg(value) { - // - let result = false; - - // - result = value && - value.length > 0; - - // - return result; -} - -/** - * validate a collection of valuea as an arguments ... - * - * @param {string|string[]} values the value collection which going to checked ... - * @returns - */ -function isValidArgs(values) { - // - // Normalize Values ... - const normalValues = toNormalArray(values); - if (!hasChildArray(normalValues)) { - return false; - } - - // - let result = normalValues.every(nv => isValidArg(nv)); - return result; -} - -/** - * converts content to an array object ... - * - * @param {string|string[]} content the content which required to normalized ... - * @returns {string[]} array object ... - */ -function toNormalArray(content = '') { - // - // Validate Args ... - if (!isValidArg(content)) { - return []; - } - - // - const result = Array.isArray(content) ? - [...content] : - content.includes(',') && - content !== ',' ? - [...content.split(',')] : - [content]; - - // - return result; -} - -/** - * determines value is array and has atleast one child ... - * - * @param {any} value the value which going to checked ... - * @returns {boolean} result of checking ... - */ -function hasChildArray(value) { - // - let result = false; - result = value && - Array.isArray(value) && - value.length > 0; - - // - return result; -} - -/** - * check an string is ends with specified symbol ... - * - * @param {string} symbol specified search symbol ... - * @param {string} value specified search content ... - * @param {boolean} ignoreCase specified search case sensitive or not ... - * @returns - */ -function endsWidth( - symbol = '', - value = '', - ignoreCase = true -) { - // - if (!isValidArg(value)) { - return false; - } - - // - if (!isValidArg(symbol)) { - return true; - } - - // - // TODO: uncomment it if necessary ... - // symbol = symbol.trim(); - - // - let result = false; - const subtractedContent = value.substring(value.length - symbol.length); - result = !!ignoreCase ? - subtractedContent - .toLowerCase() === symbol - .toLowerCase() : - subtractedContent === symbol; - - // - return result; -} - -/** - * surround specified content by provided symbol ... - * - * @param {string} symbol surround string ... - * @param {string} content used content to surrounded by symbol ... - * @returns surrounded content ... - */ -function surroundBy( - symbol = '', - content = '' -) { - // - // Validate Args ... - if (!isValidArg(content)) { - content = ''; - } - - // - if (!isValidArg(symbol)) { - symbol = ''; - } - - // - if (isSurrounded(symbol, content)) { - return content; - } - - // - const result = `${symbol}${content}${symbol}`; - return result; -} - -/** - * convert a parsed sign to clear string ... - * - * @param {string} value a parsed content ... - * @returns clear parsed signs ... - */ -function toStringExpression(value) { - // - let result = ''; - result = value; - - // - if ( - !value || - !isValidArg(value) || - !isSurroundedString(value) - ) { - return result; - } - - // - const startSymbol = value.charAt(0); - const endSymbol = value.charAt(value.length - 1); - - // - if (startSymbol !== endSymbol) { - return result; - } - - // - if ( - startSymbol === "\"" || - startSymbol === "\'" - ) { - result = clearSurround(startSymbol, value); - } - - // - return result; -} - - - -/** - * find and cleare proposed candidates from specified content ... - * - * @param {string|string[]} candidates the proposed string(s) whic going to cleared from content ... - * @param {string} content the destination content which used to find and replace candidates on it ... - * @returns cleared content ... - */ -function clearContent( - candidates, - content -) { - // - // Validate Args ... - if ( - !candidates || - !isValidArg(content) - ) { - return ''; - } - - // - // Normalize candidates ... - const normalCandidates = toNormalArray(candidates) - .filter(c => isValidArg(c)); - if (!hasChildArray(normalCandidates)) { - return content; - } - - // - // define regexp for content ... - const regExpExpression = normalCandidates.join('|'); - const regExp = new RegExp( - regExpExpression, - 'gi' - ); - - // - let result = ''; - result = content.replace(regExp, ''); - - // - return result; -} - -/** - * clear surrounded symbol from content ... - * - * @param {string} symbol specified search symbol ... - * @param {string} content specified content to clear ... - * @returns - */ -function clearSurround( - symbol = '', - content = '' -) { - // - // Validate Args ... - if ( - !isValidArg(content) || - (isValidArg(symbol) && - symbol.length >= content.length - 1) - ) { - return ''; - } - - // - // Validate Surround ... - if (!isSurrounded(symbol, content)) { - return content; - } - - // - if (!isValidArg(symbol)) { - return content; - } - - // - let result = content.substring(symbol.length, content.length - symbol.length); - return result; -} - -/** - * clear object sign ... - * - * @param {string} content - * @returns cleared content ... - */ -function clearObjectSurround(content = '') { - // - // Validate Args ... - if ( - !isValidArg(content) || - !isSurroundedObject(content) - ) { - return content; - } - - // - const endIndex = content.length - ( - endsWidth('}', content) ? - 1 : - endsWidth('},', content) || - endsWidth('};', content) || - endsWidth('}\n', content) ? - 2 : - 0 - ); - - // - const result = content.substring(1, endIndex); - return result; -} - -/** - * clear array sign ... - * - * @param {string} content - * @returns cleared content ... - */ -function clearArraySurround(content = '') { - // - // Validate Args ... - if ( - !isValidArg(content) || - !isSurroundedArray(content) - ) { - return content; - } - - // - const endIndex = content.length - ( - endsWidth(']', content) ? - 1 : - endsWidth('],', content) || - endsWidth('];', content) || - endsWidth(']\n', content) ? - 2 : - 0 - ); - - // - const result = content.substring(1, endIndex); - return result; -} - -/** - * slice a content to individual parts ... - * - * @param {number|number[]} indexes which indexes used to slice ... - * @param {strng} content the content which going to sliced ... - * @returns sliced parts of content ... - */ -function sliceContent(indexes, content) { - // - // Validate Args ... - if ( - !isValidArg(indexes) || - !isValidArg(content) - ) { - return []; - } - - // - // Normalize indexes ... - const normalIndexes = toNormalArray(indexes) - .filter(index => index > -1 && index < content.length); - if (!hasChildArray(normalIndexes)) { - return []; - } - - // - let result = ['']; - result.pop(); - - // - let lastIndex = 0; - for (const index of normalIndexes) { - // - const part = content.substring(lastIndex, index); - if (isValidArg(part)) { - result.push(part.trim()); - } - - // - lastIndex = index + 1; - } - - // - // check remained parts ... - if (lastIndex < content.length) { - // - const part = content.substring(lastIndex); - if (isValidArg(part)) { - result.push(part.trim()); - } - } - - // - return result; -} - - - -/** - * check an string is starts and ends with specified symbol ... - * - * @param {string} symbol specified search symbol ... - * @param {string} content specified search content ... - * @param {boolean} ignoreCase specified search case sensitive or not ... - * @returns - */ -function isSurrounded( - symbol = '', - content = '', - ignoreCase = true -) { - // - // Validate Args ... - if (!isValidArg(content)) { - return false; - } - - // - if (!isValidArg(symbol)) { - return true; - } - - // - symbol = symbol.trim(); - - // - let result = false; - result = (!!ignoreCase ? - content - .toLowerCase() - .startsWith(symbol.toLowerCase()) : - content.startsWith(symbol) - ) && - endsWidth(symbol, content, ignoreCase); - - // - return result; -} - -/** - * determines a content is an string surrounded value or not ... - * - * @param {string} content a content which going to check ... - * @returns - */ -function isSurroundedString(content = '') { - // - // Validate Args ... - if (!isValidArg(content)) { - return false; - } - - // - let result = false; - result = ( - content.startsWith('\'') && - ( - endsWidth('\'', content) || - endsWidth('\',', content) || - endsWidth('\';', content) || - endsWidth('\'\n', content) - ) || - content.startsWith('\"') && - ( - endsWidth('\"', content) || - endsWidth('\",', content) || - endsWidth('\";', content) || - endsWidth('\"\n', content) - ) || - content.startsWith('`') && - ( - endsWidth('\`', content) || - endsWidth('\`,', content) || - endsWidth('\`;', content) || - endsWidth('\`\n', content) - ) - ); - return result; -} - -/** - * check a content is an array content or not ... - * - * @param {string} content - * @returns - */ -function isSurroundedArray(content = '') { - // - // Validate Args ... - if (!isValidArg(content)) { - return false; - } - - // - let result = false; - result = content.startsWith('[') && - ( - endsWidth(']', content) || - endsWidth('],', content) || - endsWidth('];', content) || - endsWidth(']\n', content) - ); - return result; -} - -/** - * check a content is an object content or not ... - * - * @param {string} content - * @returns - */ -function isSurroundedObject(content = '') { - // - // Validate Args ... - if (!isValidArg(content)) { - return false; - } - - // - let result = false; - result = content.startsWith('{') && - ( - endsWidth('}', content) || - endsWidth('},', content) || - endsWidth('};', content) || - endsWidth('}\n', content) - ); - return result; -} - -/** - * check an index model is contains inside anothers or not ... - * - * @param {{ start: number, end: number}} source the source index model to check ... - * @param {...{ start: number, end: number}} dest the collection of index models which going to check ... - * @returns - */ -function isIndexInside(source, ...dest) { - // - let result = false; - - // - // Validate Args ... - if (!source || !dest) { - return result; - } - - // - // Check idx is standard ... - if ( - !source || - !source.end || - !source.start || - source.start > source.end - ) { - return false; - } - - // - // Check types of destinations ... - for (let index of dest) { - // - // Check idx is standard ... - if ( - !index || - !index.end || - !index.start || - index.start > index.end - ) { - return false; - } - } - - // - if (dest.includes(source)) { - dest = dest.filter(d => d !== source); - } - - // - const insideContentIndex = dest.find(dIndex => { - // - const result = source.start >= dIndex.start && - source.start <= dIndex.end && - source.end >= dIndex.start && - source.end <= dIndex.end; - return result; - }); - - // - result = insideContentIndex; - return result; -} - -/** - * check a number exists in - * @param {number} idx the number which going to check ... - * @param {{ start: number, end: number}} index the index model - * @returns - */ -function isInsideIndex(idx = -1, index) { - // - let result = false; - - // - // Validate Args ... - if ( - !index || - !index.hasOwnProperty('end') || - !index.hasOwnProperty('start') - ) { - return result; - } - - // - result = idx > index.start && idx < index.end; - return result; -} - -/** - * determines an object is key/value and type ... - * - * @param {any} content the object which we are going to check ... - * @returns - */ -function isKeyValueType(content) { - // - const result = content && - content.hasOwnProperty('key') && - content.hasOwnProperty('type') && - content.hasOwnProperty('value'); - - // - return result; -} - - - -/** - * find all indexes of token(s) in content ... - * - * @param {string|string[]} tokens the tokens which require to search ... - * @param {string} content the content which using to search ... - * @returns {number[]} all occured indexes ... - */ -function findAllIndexes( - tokens, - content -) { - // - // Validate Args ... - if ( - !isValidArg(tokens) || - !isValidArg(content) - ) { - return []; - } - - // - // normalize tokens ... - const normalTokens = toNormalArray(tokens); - if (!hasChildArray(normalTokens)) { - return []; - } - - // - // Parse contents ... - let match; - const result = []; - const regExp = new RegExp( - normalTokens.join('|'), - 'g' - ); - while ((match = regExp.exec(content)) !== null) { - result.push(match.index); - } - if (!hasChildArray(result)) { - return []; - } - - // - return result; -} - -/** - * find nearest symbol in a content from specified index ... - * - * @param {string|string[]} candidates specifies which symbols to find ... - * @param {string} content te content for seasrch ... - * @param {number} startFromIndex the index of start position ... - * @returns - */ -function findNearest( - candidates, - content = '', - startFromIndex = 0 -) { - // - // Validate Args ... - if ( - !isValidArg(content) || - !isValidArg(candidates) || - !isValidArg(content.trim()) - ) { - return ''; - } - - // - // Normalize Content ... - content = content.trim(); - - // - // Normalize Starts From ... - startFromIndex = startFromIndex < 0 || startFromIndex > content.length - 1 ? 0 : startFromIndex; - - // - // Normalize Symbols ... - const normalCandidates = toNormalArray(candidates); - if (!hasChildArray(normalCandidates)) { - return ''; - } - - // - let nearestIndex = findNearestIndex( - normalCandidates, - content, - startFromIndex - ); - if (nearestIndex < 0) { - return ''; - } - - // - let result = content.substring( - nearestIndex, - nearestIndex + Math.max(...normalCandidates.map(nc => nc.length)) - ).trim(); - return result; -} - -/** - * search candidates in content and find nearest one and return it ... - * - * @param {string|string[]} candidates which candidates required to check ... - * @param {string} content the content which required to search candidates ... - * @param {number} startFromIndex the proposed index to start searching content from on ... - * @returns - */ -function findNearestIndex( - candidates = [''], - content = '', - startFromIndex = 0, - ignoreClosedItems = false -) { - // - // Validate Args ... - if ( - !isValidArg(content) || - !isValidArg(candidates) - ) { - return -1; - } - - // - // Mormalize startFromIndex value ... - startFromIndex = startFromIndex < 0 ? - 0 : - startFromIndex > content.length - 1 ? - content.length - 1 : - startFromIndex; - - // - // Normalize candidates ... - let normalCandidates = toNormalArray(candidates); - - // - if (!!ignoreClosedItems) { - normalCandidates = normalCandidates - .map(c => content.indexOf( - c, - startFromIndex - ) - ).map(c => +c) - .filter(c => +c > -1); - } else { - normalCandidates = findAllIndexesOutOfCloseds(normalCandidates, content) - .filter(c => c >= startFromIndex); - } - if (!hasChildArray(normalCandidates)) { - return -1; - } - - // - let result = -1; - result = Math.min(...normalCandidates); - - // - return result; -} - -/** - * find close index of specific sign in destination content ... - * - * @param {string} openSymbol open of area sign ... - * @param {string} closeSymbol close of area sign ... - * @param {string} content the destination content for parsing ... - * @param {number} startsFrom an start index of content for start parsing ... - * @returns - */ -function findCloseIndex( - openSymbol = '', - closeSymbol = '', - content = '', - startsFrom = -1 -) { - // - // Validate Args ... - if ( - startsFrom < 0 || - !isValidArg(content) || - !isValidArg(openSymbol) || - !isValidArg(closeSymbol) || - openSymbol === closeSymbol || - !content.includes(openSymbol) || - !content.includes(closeSymbol) || - startsFrom > content.length - 1 - ) { - return -1; - } - - // - let result = -1; - - // - let index = startsFrom; - const openSignStack = []; - while (index < content.length) { - // - const openCandidate = content.substring(index, index + openSymbol.length); - const closeCandidate = content.substring(index, index + closeSymbol.length); - - // - if (openCandidate === openSymbol) { - openSignStack.push(index); - } else if (closeCandidate === closeSymbol) { - // - if (openSignStack.length > 0) { - openSignStack.pop(); - } - - // - if (openSignStack.length === 0) { - result = index; - break; - } - } - - // - index++; - } - - // - return result; -} - -/** - * find closed contents of specific sign in destination content ... - * - * @param {string} openSymbol open of area sign ... - * @param {string} closeSymbol close of area sign ... - * @param {string} content the destination content for parsing ... - * @param {number} startsFrom an start index of content for start parsing ... - * @returns - */ -function findClosedContent( - openSymbol = '', - closeSymbol = '', - content = '', - startsFrom = 0, -) { - // - let result = [{ - start: -1, - end: -1, - content: '' - }]; - result.pop(); - - // - // Validate Args ... - if ( - !isValidArg(content) || - !isValidArg(openSymbol) || - !isValidArg(closeSymbol) || - !content.includes(openSymbol) || - !content.includes(closeSymbol) || - openSymbol.length >= content.length || - closeSymbol.length >= content.length - ) { - return result; - } - - // - // Normalize Start From ... - startsFrom = startsFrom < 0 || startsFrom >= content.length ? 0 : startsFrom; - - // - let canContinue = true; - while (!!canContinue) { - // - let openSymbolIndex = content.indexOf(openSymbol, startsFrom); - if (openSymbolIndex < 0) { - // - canContinue = false; - continue; - } - - // - let closeSymbolIndex = findCloseIndex( - openSymbol, - closeSymbol, - content, - openSymbolIndex - ); - if (closeSymbolIndex < 0) { - // - canContinue = false; - continue; - } - if (content.charAt(closeSymbolIndex) !== closeSymbol) { - closeSymbolIndex++; - } - - // - // Prevent ${} string interpolations ... - if ( - openSymbol === '{' && - openSymbolIndex - 1 >= 0 - ) { - // - const prevChar = content.charAt(openSymbolIndex - 1); - if (prevChar === '$') { - continue; - } - } - - // - const item = content - .substring(openSymbolIndex, closeSymbolIndex + 1) - .trim(); - startsFrom = closeSymbolIndex + 1; - result.push({ - start: openSymbolIndex, - end: closeSymbolIndex, - content: item - }); - } - - // - if (!hasChildArray(result)) { - return result; - } - - // - return result; -} - -/** - * extract a collection of closed contents exists in a content ... - * - * @param symbols a collection of open and close contents ... - * @param {string} content a content for searching inside it ... - * @returns a collection of closed content ... - */ -function findClosedContents( - symbols = [ - { - openSymbol: '', - closeSymbol: '' - } - ], - content = '' -) { - // - let result = [{ - start: -1, - end: -1, - content: '' - }]; - result.pop(); - - // - if ( - !isValidArg(content) || - !hasChildArray(symbols) - ) { - return []; - } - - // - symbols.forEach(symbol => { - // - const closedContent = findClosedContent( - symbol.openSymbol, - symbol.closeSymbol, - content - ); - - // - if (hasChildArray(closedContent)) { - result.push( - ...closedContent - ); - } - }); - - // - return result; -} - -/** - * find all string content closed items ... - * - * @param {string} content a content which going to search ... - * @returns a collection of index descriptors ... - */ -function findClosedStrings(content = '') { - // - // Validate Args ... - if (!isValidArg(content)) { - return []; - } - - // - // there are 3 types of strings ... - // ' " and ` - - // - const token1 = '\''; - const token1Stack = [0]; - token1Stack.pop(); - - // - const token2 = '"'; - const token2Stack = [0]; - token2Stack.pop(); - - // - const token3 = '`'; - const token3Stack = [0]; - token3Stack.pop(); - - // - const result = [ - { - start: -1, - end: -1, - content: '' - } - ]; - result.pop(); - - // - for (let i = 0; i < content.length; i++) { - // - const currentChart = content.charAt(i); - - // - //#region Token 1 ... - if (currentChart === token1) { - // - if (!hasChildArray(token1Stack)) { - token1Stack.push(i); - } else { - // - const start = token1Stack.pop(); - const end = i + 1; - const pContent = content.substring(start, end); - result.push({ - start, - end, - content: pContent - }); - } - } - //#endregion - - // - //#region Token 2 ... - if (currentChart === token2) { - // - if (!hasChildArray(token2Stack)) { - token2Stack.push(i); - } else { - // - const start = token2Stack.pop(); - const end = i + 1; - const pContent = content.substring(start, end); - result.push({ - start, - end, - content: pContent - }); - } - } - //#endregion - - // - //#region Token 3 ... - if (currentChart === token3) { - // - if (!hasChildArray(token3Stack)) { - token3Stack.push(i); - } else { - // - const start = token3Stack.pop(); - const end = i + 1; - const pContent = content.substring(start, end); - result.push({ - start, - end, - content: pContent - }); - } - } - //#endregion - } - - // - return result; -} - -/** - * find container indexes from within indexes ... - * - * @param {...{start: number, end: number}} index the collection of indexes to find beiggers inside ... - * @returns - */ -function findContainerIndexes(...index) { - // - let result = [ - { - start: -1, - end: -1, - content: '' - } - ]; - result.pop(); - - // - let concatedIndexes = []; - for (let idx of index) { - // - // Index Childs ... - for (let iix of idx) { - // - // Check idx is standard ... - if ( - !iix || - !iix.end || - !iix.start || - iix.start > iix.end - ) { - continue; - } - - // - // Check index inside another index ... - concatedIndexes.push(iix); - } - } - - // - if (!hasChildArray(concatedIndexes)) { - return result; - } - - // - for (let ccIdx of concatedIndexes) { - // - const isInside = isIndexInside(ccIdx, ...concatedIndexes); - if (isInside) { - continue; - } - - // - if (hasChildArray(result)) { - // - const isInsideResult = isIndexInside(ccIdx, ...result); - if (isInsideResult) { - continue; - } - } - - // - result.push(ccIdx); - } - - // - return result; -} - -/** - * find all tokens indexes inside a content which they are not inside closed items ... - * - * @param {string|string[]} tokens the tokens which require to search ... - * @param {string} content the content which using to search ... - * @returns - */ -function findAllIndexesOutOfCloseds1( - tokens, - content, -) { - // - // Validate Args ... - if (!isValidArg(content)) { - return []; - } - - // - // Extract token Indexes ... - const tokensIndexes = findAllIndexes(tokens, content); - if (!hasChildArray(tokensIndexes)) { - return []; - } - - // - // Extract Closed Objects Indexes ... - const closedArrays = findClosedContent('[', ']', content); - const closedObjects = findClosedContent('{', '}', content); - const closedStrings = findClosedStrings(content); - if ( - !hasChildArray(closedObjects) && - !hasChildArray(closedArrays) && - !hasChildArray(closedStrings) - ) { - return tokensIndexes; - } - - // - // find bigger sloded ... - let containerClosedItems = findContainerIndexes( - closedArrays, - closedObjects, - closedStrings - ).filter(i => !isSurroundedString(i.content)); - - // - let result = [-1]; - result.pop(); - - // - for (let tIdx of tokensIndexes) { - // - let canAdd = true; - for (let ccIndex of containerClosedItems) { - // - canAdd = isInsideIndex(tIdx, ccIndex); - if (canAdd) { - break; - } - } - - // - if (!canAdd) { - result.push(tIdx); - } - } - - // - return result; -} - -/** - * find all tokens indexes inside a content which they are not inside closed items ... - * - * @param {string|string[]} tokens the tokens which require to search ... - * @param {string} content the content which using to search ... - * @returns - */ -function findAllIndexesOutOfCloseds( - tokens, - content, -) { - // - // Define Result ... - let result = [-1]; - result.pop(); - - // - // Validate Args ... - if (!isValidArg(content)) { - return []; - } - - // - // Normalize Tokens ... - const normalizeTokens = toNormalArray(tokens); - if (!hasChildArray(normalizeTokens)) { - return result; - } - - // - // Extract Closed Objects Indexes ... - let openSymbols = [ - '{', - '[', - '\'', - '"', - '`' - ]; - let closeSymbols = [ - '}', - ']', - '\'', - '"', - '`' - ]; - let openStack = []; - let lastOpenSymbol = ''; - let lastClosedIndex = -1; - for (let i = 0; i < content.length; i++) { - // - const prevChar = content.charAt(i - 1) || ''; - const char = content.charAt(i); - const nextChar = content.charAt(i + 1) || ''; - - // - const isToken = normalizeTokens.includes(char); - const isOpenSymbol = openSymbols.includes(char); - const isCloseSymbol = closeSymbols.includes(char); - - // - if (isOpenSymbol && lastOpenSymbol !== char) { - openStack.push(i); - lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? char : lastOpenSymbol; - } else if (isCloseSymbol) { - // - lastOpenSymbol = char === '\'' || char === '"' || char === '`' ? '' : lastOpenSymbol; - let lastPop = openStack.pop(); - if (openStack.length === 0) { - lastClosedIndex = lastPop; - } - } else if (isToken) { - if ( - i > lastClosedIndex && - openStack.length === 0 - ) { - result.push(i); - } - } - } - - // - return result; -} -//#endregion - -// -//#region Validator Actions ... -/** - * check specified value is Valid URL Address or not ... - * - * @param {string} value specified string which required to check - * @returns {boolean} - */ -function isValidURL(value = "") { - // - if (!isValidArg(value)) { - return false; - } - - const pattern = new RegExp( - '^([a-zA-Z]+:\\/\\/)?' + // protocol - '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name - '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR IP (v4) address - '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path - '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string - '(\\#[-a-z\\d_]*)?$', // fragment locator - 'i' - ); - - // - const result = pattern.test(value); - return result; -} - -/** - * check specified value is Valid URL Address or not ... - * - * @param {string} value specified string which required to check - */ -function isValidEmail(value = "") { - // - if (!isValidArg(value)) { - return false; - } - - // - const pattern = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/gim; - - // - const result = pattern.test(value); - return result; -} -//#endregion - -// -//#region Normallizers ... -/** - * normallize an string ... - * - * @param {string} value specified value ... - * @returns {string} - */ -function toNormalString(value = "") { - // - if (!XTypeTools.isString(value)) { - value = ""; - } - - // - const result = value - .trim() - .toLowerCase(); - - // - return result; -} -//#endregion - -// -//#region Beautifiers ... -/** - * converts an object to string based on json and beautify result ... - * - * @param {any} object - * @returns {string} - */ -function beautifyJSON(object = undefined) { - // - // TODO: Complete this ... - let result = ""; - - // - // validate object ... - if (object === undefined) { - return result; - } - - // - // Convert result ... - result = JSON.stringify( - object, - null, - 4 - ); - - // - return result; -} -//#endregion - -// -//#region Module Exports ... -module.exports = { - // - endsWidth, - surroundBy, - isValidArg, - isValidArgs, - toNormalArray, - hasChildArray, - toStringExpression, - - // - sliceContent, - clearContent, - clearSurround, - clearArraySurround, - clearObjectSurround, - - // - isSurrounded, - isIndexInside, - isInsideIndex, - isKeyValueType, - isSurroundedArray, - isSurroundedString, - isSurroundedObject, - - // - findNearest, - findAllIndexes, - findCloseIndex, - findNearestIndex, - findClosedContent, - findClosedStrings, - findClosedContents, - findAllIndexesOutOfCloseds, - - // - // Validator Actions ... - isValidURL, - isValidEmail, - - // - // Normallizers ... - toNormalString, - - // - beautifyJSON, -} -//#endregion \ No newline at end of file diff --git a/Documents/XCATBEAInputs/Pack 1.7z b/Documents/XCATBEAInputs/Pack 1.7z new file mode 100644 index 0000000000000000000000000000000000000000..60f33e67fc22d1d48e131bffd29da67b5a44361a GIT binary patch literal 1075 zcmV-31kC$4dc3bE8~_B$zxu-P0{{R30000Z0000000006&=GjxDQ^O{T>uvD1Pui~ z_|oATECvT^RmONiUe)SZ{#X+(Mx_E_%P&RaNKws^A6E2aFZU{W?q{Y>i4BZFE zREcs*J|91}p0&Fidpd#bTk(SQ7l_K!$hEHm*f@gCGWjq)%{VhuY1jaY*%-Az>rS@X z9o`WL`L!)SuOzCRtqhjA^?8O_68xxeoKe+CjR zX9g}XMPU3cCae$9F>#7}*Mnmm@oPeBI_H=XoiA*c@KW%X;hDxf}0fo8ppg z$9IPdZZkF+X5O`GA>Q7{tEcRhX=-X)g@gI$V>uoI_h%+JsWvRkRaAkGI|`r)<)i**LTJ* zx@||b%n1Wmu)ElO993Jt+W6H<$I~t7Yom^~fm>+D`2RM781HmtEWAz7xqy0*#pg`Q z1!h{+5A~Cq^1EbK|De83&Wp6E-TaN6L{Et13qGHpizO_)1GP=#Pi#3Xp5hS}*KLr8 z#YG8qsiLuE%a#(Mdgb1SjvRnuUb`67VFKnamt5c88n>OyeTw+MnoykWrK^h7m%)O2 zR%#eox~Fh`s;I_)aRd4TyD@mn75vvv3x%SEE)rgVepy0K*C%kju0X(c~U% zFx!GkMcsN2OUJ|<6tqLau*BK{tC)qm=XBw(+%Bx~Mms#$Z$FEgdnuWI4=(=(S2a_V z0vO{6n}Rl3hEEN2dPzkDc$B$7R#ntOt*d3C5>E)V$wKz{oRUF2wS>-R=PkEfjGVRM z!scBa=@p{(#v0%|0C>r@ujxq33Q;QMx&2d3RY+7R9HDk9v`)V8PG((2)i!0bD~SBcBbA*E*2Lj(+Vt-D?s96BMRRw zB`;^PS~Nt>=O7PLH{qP+2EW2(+}kS2JrJc;94(Gv?zjQLmh8{o`DDTdm?RxiR{-YD to*>0}oL~SK27$E5C8xSgiZ -string ToString(T value) +string ToXString(T value) { return (string)value; } @@ -1859,7 +1902,7 @@ string Trim(string value) // // Used In Report or Summary Generators ... -string ToString( +string ToXString( string prefix, // Title bool value, // Value bool ignoreFalseConditions = true, // Ignore False Conditions @@ -1872,7 +1915,7 @@ string ToString( // bool canSet = - IsBoolean(ToString(value)) + IsBoolean(ToXString(value)) ? (bool)value || !ignoreFalseConditions : true; @@ -1880,7 +1923,7 @@ string ToString( result = canSet ? prefix + prefixSeparator + " " + - ToString(value) + + ToXString(value) + lineSeparator : ""; @@ -1890,7 +1933,7 @@ string ToString( // template -string ToString( +string ToXString( string prefix, // Title T value, // Value string lineSeparator = "\n", // Line Separator @@ -1903,7 +1946,7 @@ string ToString( // result = prefix + prefixSeparator + " " + - ToString(value) + + ToXString(value) + lineSeparator; // @@ -1944,7 +1987,7 @@ string SetLabel( // // Converts a Buffer to String Representation ... template -string ToString( +string ToXString( const T &buffer[], // Specified Buffer string separator = ",", // Specified Separator bool addIndex = false, // Specified Add Items Indexes or Not @@ -2015,7 +2058,7 @@ bool IsBoolean(string value) // string istring = value; - string normalizedValue = ToString(istring); + string normalizedValue = ToXString(istring); StringToLower(normalizedValue); normalizedValue = Trim(normalizedValue); @@ -2726,7 +2769,7 @@ string Surround( string result = NULL; // - string strValue = ToString(value); + string strValue = ToXString(value); if (!IsValid(strValue)) { return result; @@ -2762,7 +2805,7 @@ string SurroundArray( string result = NULL; // - string valueStr = ToString(value); + string valueStr = ToXString(value); if (!IsValid(valueStr)) { return result; @@ -2908,7 +2951,7 @@ ENUM_TIMEFRAMES ToPeriod(string value) * * @return ( string ) */ -string ToString(ENUM_TIMEFRAMES value) +string ToXString(ENUM_TIMEFRAMES value) { // string result = ""; @@ -3758,7 +3801,7 @@ int Add( return result; } template -int AddSpecific( +int AddSpecified( T item, // item want to add T &buffer[] // Destination buffer ) @@ -3801,7 +3844,7 @@ bool HasChild(T &buffer[]) return IsValidSize(ArraySize(buffer)); } template -bool SpecificHasChild(T &buffer[]) +bool SpecifiedHasChild(T &buffer[]) { return HasChild(buffer); } @@ -3846,7 +3889,7 @@ void Clean(T &buffer[]) ZeroMemory(buffer); } template -void SpecificClean(T &buffer[]) +void SpecifiedClean(T &buffer[]) { Clean(buffer); } @@ -4194,6 +4237,15 @@ int FindIndex( // return result; } +template +int FindXIndex( + T item, // What is Search ... + T &buffer[] // Search in ... +) +{ + return FindIndex(item, buffer); +} + // // Find Specific Item Index inside a Collection ... template @@ -4245,6 +4297,14 @@ int FindIndex( // return result; } +template +int FindXIndex( + T &item, // Item to Find + const T &items[] // Items for Search +) +{ + return FindIndex(item, items); +} // // Check an Array Contains Specified Value ... @@ -5720,14 +5780,14 @@ string GetTimeString( } // - string hour = ToString(tStruct.hour); + string hour = ToXString(tStruct.hour); hour = StringLen(hour) == 1 ? "0" + hour : hour; // - string minute = ToString(tStruct.min); + string minute = ToXString(tStruct.min); minute = StringLen(minute) == 1 ? "0" + minute @@ -5768,12 +5828,12 @@ string ToFormatString( } // - string year = ToString(timeStruct.year); - string month = ToString(timeStruct.mon); - string day = ToString(timeStruct.day); - string hour = ToString(timeStruct.hour); - string minute = ToString(timeStruct.min); - string second = ToString(timeStruct.sec); + string year = ToXString(timeStruct.year); + string month = ToXString(timeStruct.mon); + string day = ToXString(timeStruct.day); + string hour = ToXString(timeStruct.hour); + string minute = ToXString(timeStruct.min); + string second = ToXString(timeStruct.sec); // result = diff --git a/Libraries/x-saherelm.x-enums.lib.mq5 b/Libraries/x-saherelm.x-enums.lib.mq5 index e2124253..725caf56 100644 --- a/Libraries/x-saherelm.x-enums.lib.mq5 +++ b/Libraries/x-saherelm.x-enums.lib.mq5 @@ -342,6 +342,10 @@ bool IsValid(ENUM_X_BOUNDARY_PRICE value) // return result; } +bool IsSpecifiedValid(ENUM_X_BOUNDARY_PRICE value) +{ + return IsValid(value); +} /** * Converts To String ... diff --git a/Libraries/x-saherelm.x-ohcl.lib.mq5 b/Libraries/x-saherelm.x-ohcl.lib.mq5 index fe20b603..2863382f 100644 --- a/Libraries/x-saherelm.x-ohcl.lib.mq5 +++ b/Libraries/x-saherelm.x-ohcl.lib.mq5 @@ -954,8 +954,8 @@ struct XOHCL } // - bool isBullish = IsBullish(forDir); - bool isBearish = IsBearish(forDir); + bool isBullish = IsSpecifiedBullish(forDir); + bool isBearish = IsSpecifiedBearish(forDir); // double fiboLevelValue = GetFibonacciLevel( @@ -1003,13 +1003,13 @@ struct XOHCL // bool isBullish = - IsBullish(forDir) && + IsSpecifiedBullish(forDir) && low < price && GetDown() > price; // bool isBearish = - IsBearish(forDir) && + IsSpecifiedBearish(forDir) && high > price && GetUp() < price; @@ -1064,7 +1064,7 @@ struct XOHCL result = IsValid() && price > 0 && HasDirection(forDir) && - IsValid(boundaryType); + IsSpecifiedValid(boundaryType); if (!result) { return result; @@ -1078,14 +1078,14 @@ struct XOHCL IsBullish() && low < price && high > price && - IsBullish(forDir); + IsSpecifiedBullish(forDir); // bool isBearish = IsBearish() && low < price && high > price && - IsBearish(forDir); + IsSpecifiedBearish(forDir); // result = isBullish || @@ -1346,10 +1346,10 @@ struct XOHCL // result = - (IsValid(prefix) + (IsSpecifiedValid(prefix) ? prefix + "_" : "") + - "XOHCL_" + symbol + "_" + ToString(period) + "_" + ToFormatString(time); + "XOHCL_" + symbol + "_" + ToXString(period) + "_" + ToFormatString(time); // return result; @@ -1364,7 +1364,7 @@ struct XOHCL // result = GetTypeName(this) + - "(O(" + ToString(open) + "),H(" + ToString(high) + "),C(" + ToString(close) + "),L(" + ToString(low) + "))"; + "(O(" + ToXString(open) + "),H(" + ToXString(high) + "),C(" + ToXString(close) + "),L(" + ToXString(low) + "))"; // return result; @@ -1496,7 +1496,7 @@ struct XBarRemainsTime if (!ignoreZeroValues || hours > 0) { // - string strHour = ToString(hours); + string strHour = ToXString(hours); if (StringLen(strHour) == 1) { strHour = "0" + strHour; @@ -1511,7 +1511,7 @@ struct XBarRemainsTime if (!ignoreZeroValues || minutes > 0) { // - string strMinute = ToString(minutes); + string strMinute = ToXString(minutes); if (StringLen(strMinute) == 1) { strMinute = "0" + strMinute; @@ -1526,7 +1526,7 @@ struct XBarRemainsTime if (!ignoreZeroValues || seconds > 0) { // - string strSec = ToString(seconds); + string strSec = ToXString(seconds); if (StringLen(strSec) == 1) { strSec = "0" + strSec; diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 3872ce9e..77140d21 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -93,11 +93,11 @@ struct XBoxZone upper > 0 && lower > 0 && from < to && - IsValid(to) && + IsSpecifiedValid(to) && upper >= lower && - IsValid(from) && - IsValid(symbol) && - IsValid(period) + IsSpecifiedValid(from) && + IsSpecifiedValid(symbol) && + IsSpecifiedValid(period) // ; @@ -113,7 +113,7 @@ struct XBoxZone bool IsBullish() { return IsValid() && - IsBullish(dir); + IsSpecifiedBullish(dir); } /** @@ -124,7 +124,7 @@ struct XBoxZone bool IsBearish() { return IsValid() && - IsBearish(dir); + IsSpecifiedBearish(dir); } /** @@ -209,7 +209,7 @@ struct XBoxZone } // - if (!IsValid(forPeriod)) + if (!IsSpecifiedValid(forPeriod)) { forPeriod = period; } @@ -379,7 +379,7 @@ struct XBoxZone } // - if (!IsValid(forPeriod)) + if (!IsSpecifiedValid(forPeriod)) { forPeriod = period; } @@ -450,7 +450,7 @@ struct XBoxZone } // - if (!IsValid(forPeriod)) + if (!IsSpecifiedValid(forPeriod)) { forPeriod = period; } @@ -515,7 +515,7 @@ struct XBoxZone double nLower = NormalizeDouble(NormalizePrice(lower, symbol), digits); // - string typeStr = IsValid(type) + string typeStr = IsSpecifiedValid(type) ? type : "XBOX"; string result = @@ -523,9 +523,9 @@ struct XBoxZone typeStr + "_" + ToString(dir) + "_" + symbol + "_" + - ToString(period) + "_" + - ToString(nUpper) + "_" + - ToString(nLower) + ToXString(period) + "_" + + ToXString(nUpper) + "_" + + ToXString(nLower) // ; @@ -545,7 +545,7 @@ struct XBoxZone double nMid = NormalizeDouble(NormalizePrice(GetMid(), symbol), digits); // - string typeStr = IsValid(type) + string typeStr = IsSpecifiedValid(type) ? type : "XBOX"; string result = @@ -554,8 +554,8 @@ struct XBoxZone "Mid_" + ToString(dir) + "_" + symbol + "_" + - ToString(period) + "_" + - ToString(nMid) + ToXString(period) + "_" + + ToXString(nMid) // ; @@ -614,11 +614,11 @@ struct XDirectionShift // result = after > 0 && - IsValid(at) && - IsValid(type) && + IsSpecifiedValid(at) && + IsSpecifiedValid(type) && after != before && - IsValid(symbol) && - IsValid(period) && + IsSpecifiedValid(symbol) && + IsSpecifiedValid(period) && HasDirection(shiftTo); // diff --git a/Libraries/x-saherelm.x-trade.lib.mq5 b/Libraries/x-saherelm.x-trade.lib.mq5 index f90862fc..6a6a31cc 100644 --- a/Libraries/x-saherelm.x-trade.lib.mq5 +++ b/Libraries/x-saherelm.x-trade.lib.mq5 @@ -353,7 +353,7 @@ struct XRR type = X_POSITION_TYPE_NONE; // - Clean(tps); + SpecifiedClean(tps); // ZeroMemory(this); @@ -376,8 +376,8 @@ struct XRR result = _sl > 0 && _entry > 0 && - IsValid(_symbol) && - IsValid(_period) && + IsSpecifiedValid(_symbol) && + IsSpecifiedValid(_period) && _type != X_POSITION_TYPE_ALL && _type != X_POSITION_TYPE_NONE && (_type == X_POSITION_TYPE_LONG @@ -453,9 +453,9 @@ struct XRR result = sl > 0 && entry > 0 && - IsValid(time) && - IsValid(symbol) && - IsValid(period) && + IsSpecifiedValid(time) && + IsSpecifiedValid(symbol) && + IsSpecifiedValid(period) && IsValidSize(ArraySize(tps)) && type != X_POSITION_TYPE_ALL && type != X_POSITION_TYPE_NONE && @@ -486,7 +486,7 @@ struct XRR // result = - GetTypeName(this) + sep + (IsValid(prefix) ? prefix + sep : "") + symbol + sep + ToString(period) + sep + ToFormatString(time) + sep + ToString(type); + GetTypeName(this) + sep + (IsSpecifiedValid(prefix) ? prefix + sep : "") + symbol + sep + ToXString(period) + sep + ToFormatString(time) + sep + ToString(type); // return result; @@ -864,7 +864,7 @@ struct XPosition // result = // - IsValid(symbol) && + IsSpecifiedValid(symbol) && NotEmpty(ticket) // ; @@ -887,7 +887,7 @@ struct XPosition } // - result = GetEntry( + result = GetXEntry( symbol, type // @@ -911,7 +911,7 @@ struct XPosition } // - result = GetExit( + result = GetXExit( symbol, type // @@ -935,7 +935,7 @@ struct XPosition } // - result = PriceToPoint(GetSpread(symbol)); + result = PriceToPoint(GetXSpread(symbol)); // return result; @@ -1067,7 +1067,7 @@ struct XPosition int result = 0; // - Clean(tps); + SpecifiedClean(tps); // bool isValid = IsValid(); @@ -1175,7 +1175,7 @@ struct XPosition ENUM_TIMEFRAMES mPeriod // Calculate Age based on this period ) { - return GetAge(this, mPeriod); + return GetXAge(this, mPeriod); } // @@ -1207,11 +1207,11 @@ struct XPosition // // Find index in a Collection ... int FindIndex( - const XPosition &values[] // Collection to Find + XPosition &values[] // Collection to Find ) { // - return FindIndex( + return FindXIndex( this, values // @@ -1358,7 +1358,7 @@ struct XSignal conditions = NULL; // - Clean(targets); + SpecifiedClean(targets); appliedTargetIDX = -1; ignoreEAVolume = false; isTargetApplied = false; @@ -1387,7 +1387,7 @@ struct XSignal conditions = NULL; // - Clean(targets); + SpecifiedClean(targets); appliedTargetIDX = -1; ignoreEAVolume = false; isTargetApplied = false; @@ -1403,8 +1403,8 @@ struct XSignal // result = // - IsValid(period) && - IsValid(symbol) && + IsSpecifiedValid(period) && + IsSpecifiedValid(symbol) && NotEmpty(volume) && NotEmpty(entry) // @@ -1481,7 +1481,7 @@ struct XSignal } // - if (IsValid(provider)) + if (IsSpecifiedValid(provider)) { // // Generate Provider Tag ... @@ -1489,7 +1489,7 @@ struct XSignal } // - if (IsValid(period)) + if (IsSpecifiedValid(period)) { // // Generate Period Tag ... @@ -1504,7 +1504,7 @@ struct XSignal int GetAge() { // - return GetAge( + return GetXAge( this, this.period // ); @@ -1579,11 +1579,11 @@ struct XSignal // result = "XSignal_" + symbol + "_" + - ToString(period) + "_" + - ToString(type) + "_" + - ToString(sl) + "_" + - ToString(tp) + "_" + - ToString(entry); + ToXString(period) + "_" + + ToXString(type) + "_" + + ToXString(sl) + "_" + + ToXString(tp) + "_" + + ToXString(entry); // return result; @@ -1599,17 +1599,17 @@ struct XSignal // result = // - ToString("Symbol", symbol) + - ToString("Period", period) + - ToString("Provider", provider) + - ToString("Type", type) + - ToString("Mode", mode) + - ToString("Volume", volume) + - ToString("Entry", entry) + - ToString("TP", tp) + - ToString("SL", sl) + - ToString("Time", time) + - ToString("Comment", comment) + + ToXString("Symbol", symbol) + + ToXString("Period", period) + + ToXString("Provider", provider) + + ToXString("Type", type) + + ToXString("Mode", mode) + + ToXString("Volume", volume) + + ToXString("Entry", entry) + + ToXString("TP", tp) + + ToXString("SL", sl) + + ToXString("Time", time) + + ToXString("Comment", comment) + // "" // @@ -1660,14 +1660,14 @@ struct XSignal } // - result = ToString(type) + + result = ToXString(type) + " Signal" + - (!IsValid(action) + (!IsSpecifiedValid(action) ? "" : " " + action) + " by: " + provider + " on (" + symbol + ")" + - " in: " + ToString(period); + " in: " + ToXString(period); // return result; @@ -1689,8 +1689,8 @@ struct XSignal result = // symbol + "\\" + - ToString(type) + "\\" + - ToString(period) + "_" + + ToXString(type) + "\\" + + ToXString(period) + "_" + ToFormatString(time) // ; @@ -1978,7 +1978,7 @@ struct XOrder // result = // - IsValid(symbol) && + IsSpecifiedValid(symbol) && NotEmpty(ticket) && NotEmpty(positionId) // @@ -1994,7 +1994,7 @@ struct XOrder ENUM_TIMEFRAMES mPeriod // Calculate Age based on this period ) { - return GetAge(this, mPeriod); + return GetXAge(this, mPeriod); } // @@ -2026,11 +2026,11 @@ struct XOrder // // Find index in a Collection ... int FindIndex( - const XOrder &values[] // Collection to Find + XOrder &values[] // Collection to Find ) { // - return FindIndex( + return FindXIndex( this, values // @@ -2338,7 +2338,7 @@ struct XDeal // result = // - IsValid(symbol) && + IsSpecifiedValid(symbol) && NotEmpty(ticket) && NotEmpty(positionId) // @@ -2354,7 +2354,7 @@ struct XDeal ENUM_TIMEFRAMES mPeriod // Calculate Age based on this period ) { - return GetAge(this, mPeriod); + return GetXAge(this, mPeriod); } // @@ -2388,11 +2388,11 @@ struct XDeal // // Find index in a Collection ... int FindIndex( - const XDeal &values[] // Collection to Find + XDeal &values[] // Collection to Find ) { // - return FindIndex( + return FindXIndex( this, values // @@ -2668,7 +2668,7 @@ struct XSymbolPositions ); // - Clean(positions); + SpecifiedClean(positions); // int tmpsCount = ArraySize(_tmp); @@ -2698,14 +2698,14 @@ struct XSymbolPositions } // - Clean(_tmp); + SpecifiedClean(_tmp); // Copy( _positions, positions // ); - Clean(_positions); + SpecifiedClean(_positions); // // Extract Types ... @@ -2720,7 +2720,7 @@ struct XSymbolPositions _supports, supports // ); - Clean(_supports); + SpecifiedClean(_supports); // // Extract Types ... @@ -2779,7 +2779,7 @@ struct XSymbolPositions ); // - Clean(_allPositions); + SpecifiedClean(_allPositions); // result = true; @@ -2813,9 +2813,9 @@ struct XSymbolPositions requiredProfitForHedge = 0; // - Clean(longs); - Clean(shorts); - Clean(positions); + SpecifiedClean(longs); + SpecifiedClean(shorts); + SpecifiedClean(positions); // ZeroMemory(this); @@ -2829,7 +2829,7 @@ struct XSymbolPositions bool result = false; // - result = IsValid(symbol); + result = IsSpecifiedValid(symbol); // return result; @@ -2920,7 +2920,7 @@ struct XSymbolPositions if (isLong) { // - result = GetOldest( + result = GetXOldest( _oldest, longs // ); @@ -2928,7 +2928,7 @@ struct XSymbolPositions else { // - result = GetOldest( + result = GetXOldest( _oldest, shorts // ); @@ -2964,7 +2964,7 @@ struct XSymbolPositions if (isLong) { // - result = GetYoungest( + result = GetXYoungest( _youngest, longs // ); @@ -2972,7 +2972,7 @@ struct XSymbolPositions else { // - result = GetYoungest( + result = GetXYoungest( _youngest, shorts // ); @@ -3284,6 +3284,13 @@ int GetAge( // return result; } +int GetXAge( + XSignal &signal, // Selected Signal ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + return GetAge(signal, period); +} // // Retrieve a Position Age ... @@ -3310,6 +3317,13 @@ int GetAge( // return result; } +int GetXAge( + XPosition &position, // Selected Position ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + return GetAge(position, period); +} // // Retrieve an Order Age ... @@ -3336,6 +3350,13 @@ int GetAge( // return result; } +int GetXAge( + XOrder &order, // Selected Order ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + return GetAge(order, period); +} // // Retrieve a Deal Age ... @@ -3362,6 +3383,13 @@ int GetAge( // return result; } +int GetXAge( + XDeal &deal, // Selected Deal ... + ENUM_TIMEFRAMES period = NULL // Dest Time Frame ... +) +{ + return GetAge(deal, period); +} // // Get Oldest Deal ... @@ -3410,6 +3438,13 @@ int GetOldest( // return result; } +int GetXOldest( + XDeal &item, // Hold Result ... + XDeal &items[] // Source Array ... +) +{ + return GetOldest(item, items); +} // // Get Youngest Deal ... @@ -3458,6 +3493,13 @@ int GetYoungest( // return result; } +int GetXYoungest( + XDeal &item, // Hold Result ... + XDeal &items[] // Source Array ... +) +{ + return GetYoungest(item, items); +} // // Get Oldest Order ... @@ -3506,6 +3548,13 @@ int GetOldest( // return result; } +int GetXOldest( + XOrder &item, // Hold Result ... + XOrder &items[] // Source Array ... +) +{ + return GetOldest(item, items); +} // // Get Youngest Order ... @@ -3554,6 +3603,13 @@ int GetYoungest( // return result; } +int GetXYoungest( + XOrder &item, // Hold Result ... + XOrder &items[] // Source Array ... +) +{ + return GetYoungest(item, items); +} // // Get Oldes Position ... @@ -3602,6 +3658,13 @@ int GetOldest( // return result; } +int GetXOldest( + XPosition &item, // Hold Result ... + XPosition &items[] // Source Array ... +) +{ + return GetOldest(item, items); +} // // Get Youngest Position ... @@ -3650,6 +3713,13 @@ int GetYoungest( // return result; } +int GetXYoungest( + XPosition &item, // Hold Result ... + XPosition &items[] // Source Array ... +) +{ + return GetYoungest(item, items); +} // int FindMaxProfitIndex( @@ -4481,7 +4551,7 @@ ENUM_ORDER_TYPE ToOrderType(ENUM_X_POSITION_TYPES value) string GeneratePeriodTag(ENUM_TIMEFRAMES period) { // - string strPeriod = ToString(period); + string strPeriod = ToXString(period); return Surround( XPeriodToken, strPeriod