prepare workspace by eu5, add some scripts and node modules on Documents folder, extends compile script and also node module to automate usefull most commonly used compilation tasks and also create required npm scripts and vscode debug lunch tasks based on them ...

This commit is contained in:
2024-01-31 15:02:23 -08:00
parent b612162136
commit 732b6bba35
45 changed files with 3813 additions and 49 deletions
+398
View File
@@ -0,0 +1,398 @@
//
// 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");
//
// define constants ...
const projectsPath = XFileTools.joinPath(".", "Projects");
const packsPath = XFileTools.joinPath(".", "Packs");
const excludeWorkspaceFolders = [
"BKP",
"Documents",
"Images",
"Includes",
"Logs",
"Packs",
"Profiles",
"Projects",
"Scripts",
"Services",
"Shared Projects"
];
//
// Read Command Arguments ...
let projectName = process.argv[2];
let doPackProject = process.argv[3] || false;
//
// Make Decission to what to Do based on given args ...
if (!projectName ||
projectName == "" ||
projectName.length == 0) {
//
// Compile Whole MQL Workspace ...
doPackProject = false;
const workSpacePath = XFileTools.joinPath(".", __dirname);
//
doWorkspaceCompile(workSpacePath);
} else if (projectName == "--experts" || projectName == "**experts") {
//
// Compile Experts on Workspace ...
doPackProject = false;
const workSpacePath = XFileTools.joinPath(".", __dirname, "Experts");
//
doWorkspaceCompile(workSpacePath);
} else if (projectName == "--indicators" || projectName == "**indicators") {
//
// Compile Indicators on Workspace ...
doPackProject = false;
const workSpacePath = XFileTools.joinPath(".", __dirname, "Indicators");
//
doWorkspaceCompile(workSpacePath);
} else if (projectName == "--libraries" || projectName == "**libraries") {
//
// Compile Libraries on Workspace ...
doPackProject = false;
const workSpacePath = XFileTools.joinPath(".", __dirname, "Libraries");
//
doWorkspaceCompile(workSpacePath);
} else {
//
// Compile Specific Projects ...
//
// Prepare Project Folder Path ...
const prjPath = XFileTools.joinPath(projectsPath, projectName);
//
// Check Project Folder Exists ...
const isProjectFolderExists = XFileTools.isDirectoryExists(prjPath);
if (!isProjectFolderExists) {
//
const msg = "Project doesn't Exists ...";
console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red));
throw msg;
}
//
// Call Handler Function ...
doProjectCompile(prjPath);
}
//
async function doProjectCompile(path = "") {
//
let result = await handleProjectCompile(path);
if (result && doPackProject) {
result = await handleProjectPack(path);
}
}
//
async function doWorkspaceCompile(path = "") {
//
let mustCompileFiles = await readMQLFiles(path);
//
if (mustCompileFiles && mustCompileFiles.length > 0) {
//
// Loop through items ...
for (const f of mustCompileFiles) {
//
// Check Exclude ...
const fBaseName = XFileTools.basename(f);
let fPath = f.replace(fBaseName, "");
let isExclude = false;
for (const e of excludeWorkspaceFolders) {
//
isExclude = fPath.includes(e);
if (isExclude) {
break;
}
}
//
if (isExclude) {
continue;
}
//
// Log ...
console.log(
XColorTools.applyForegroundColor("try to compile: ", XColorTools.COLOR_NAMES.Yellow),
XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue)
);
//
const result = await compileMQLFile(f);
//
if (result.includes("0 errors")) {
//
const msg = "compiled successfully ...";
console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Green));
} else {
//
const msg = "failed ...";
console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red));
throw msg;
}
}
//
return true;
}
//
return false;
}
/**
* read all content in project path and compile it one by one ...
*
* @param {string} path Project Path ...
*/
async function handleProjectCompile(path = "") {
//
let mustCompileFiles = await readMQLFiles(path);
//
if (mustCompileFiles && mustCompileFiles.length > 0) {
//
// Loop through items ...
for (const f of mustCompileFiles) {
//
// Log ...
console.log(
XColorTools.applyForegroundColor("try to compile: ", XColorTools.COLOR_NAMES.Yellow),
XColorTools.applyForegroundColor(f, XColorTools.COLOR_NAMES.Blue)
);
//
const result = await compileMQLFile(f);
//
if (result.includes("0 errors")) {
//
const msg = "compiled successfully ...";
console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Green));
} else {
//
const msg = "failed ...";
console.log(XColorTools.applyForegroundColor(msg, XColorTools.COLOR_NAMES.Red));
throw msg;
}
}
//
return true;
}
//
return false;
}
/**
* Pack Compiled Project ...
*
* @param {string} path Project Path ...
*/
async function handleProjectPack(path = "") {
//
const projectName = XFileTools.basename(path);
//
// check packs exists or not ...
const isPacksExists = XFileTools.isDirectoryExists(packsPath);
if (!isPacksExists) {
XFileTools.createDirectory(packsPath);
}
//
// Reading Compiled Files ...
const mustCopyFiles = await readEXTFiles(path);
if (!mustCopyFiles || mustCopyFiles.length == 0) {
return false;
}
//
const prjPackPath = XFileTools.joinPath(packsPath, projectName);
//
// Check Project Packs Folder ...
const isProjectPackExists = XFileTools.isDirectoryExists(prjPackPath);
if (isProjectPackExists) {
await XFileTools.removeDirectory(prjPackPath, true);
}
//
// Create Empty Project Folder on Pack ...
XFileTools.createDirectory(prjPackPath);
//
// Loop through Files ...
for (const f of mustCopyFiles) {
//
// Prepare Destination Path ...
const fBasePath = XFileTools.basename(f);
let fDestPath = f.replace(fBasePath, "")
.replace(projectsPath, packsPath);
fDestPath = fDestPath.substring(0, fDestPath.length - 1);
//
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;
}
}
//
return true;
}
/**
* Extract Project MQL files ...
*
* @param {string} path Folder Path ...
* @returns
*/
async function readMQLFiles(path = "") {
//
const result = await extractFiles(path, [".mq5", ".mq4"]);
//
return result;
}
/**
* Extract Project Compiled files ...
*
* @param {string} path Folder Path ...
* @returns
*/
async function readEXTFiles(path = "") {
//
const result = await extractFiles(path, [".ex5", ".ex4"]);
//
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;
}
/**
* Extract Specific files from a folder and it's content ...
*
* @param {string} path Folder Path ...
* @returns
*/
async function extractFiles(path = "", ext = []) {
//
const result = [];
//
if (!ext || ext.length == 0) {
return result;
}
//
const pathContent = await XFileTools.getDirectoryContents(path);
if (!pathContent || pathContent.length == 0) {
return result;
}
//
// Loop through Content ...
for (const c of pathContent) {
//
// Prepare full path ...
const cPath = XFileTools.joinPath(path, c);
//
// check content path is file or not ...
const isCFile = XFileTools.isFileExists(cPath);
const isCDirectory = XFileTools.isDirectoryExists(cPath);
if (isCFile) {
//
// Check it is MQL file or not ...
const cExt = XFileTools.getFileExtension(cPath);
if (ext.includes(cExt)) {
result.push(cPath);
}
} else if (isCDirectory) {
//
const cFiles = await extractFiles(cPath, ext);
if (cFiles && cFiles.length > 0) {
result.push(...cFiles);
}
}
}
//
return result;
}