1
0
rotorflight-presets/indexer/PresetsFolder.js
Chris Kim fd9f215f9d
Add initial presets (#1)
Signed-off-by: Chris Kim <oats87g@gmail.com>
2025-04-01 12:47:05 +10:00

80 lines
2.5 KiB
JavaScript

'use strict';
const fs = require("fs");
const path = require("path");
const PresetsFile = require('./PresetsFile');
class PresetsFolder
{
constructor(fullPath, settings, presetFilesArray, errors)
{
this.subFolders = [];
this.files = [];
this.fullPath = fullPath;
this.name = "";
let list = fs.readdirSync(fullPath);
list.forEach((fileName) => {
const fullFileName = fullPath + '/' + fileName;
const stat = fs.statSync(fullFileName);
if (!fileName.startsWith(".")) {
if (stat && stat.isDirectory()) {
let subdir = new PresetsFolder(fullFileName, settings, presetFilesArray, errors);
subdir.name = fileName;
this.subFolders.push(subdir);
} else if (fileName.toLowerCase().endsWith(".txt")) {
let presetsFile = new PresetsFile(fullFileName, settings, errors);
presetFilesArray.push(presetsFile);
this.files.push(presetsFile);
}
}
});
}
static checkForIncludeLoops(presetFilesArray, errors)
{
const filesDb = PresetsFolder._createFilesDictionary(presetFilesArray);
const fileNameErrors = {};
presetFilesArray.forEach((file) => {
const parents = [];
PresetsFolder._checkFileForIncludeLoops(file, filesDb, parents, fileNameErrors);
});
for (const fileNameError in fileNameErrors) {
const errorText = `File ${fileNameError}, takes part in the #$ INCLUDE loop'`;
errors.push(errorText);
console.error(errorText);
}
}
static _checkFileForIncludeLoops(file, filesDb, parents, fileNameErrors)
{
if (parents.includes(file.fullPath)) {
fileNameErrors[file.fullPath] = true;
} else {
parents.push(file.fullPath);
if (file.hasOwnProperty("include")) {
file.include.forEach((includedFileName) => {
const clonedParents = [...parents];
PresetsFolder._checkFileForIncludeLoops(filesDb[includedFileName], filesDb, clonedParents, fileNameErrors);
});
}
}
}
static _createFilesDictionary(presetFilesArray)
{
let result = {};
presetFilesArray.forEach((file) => {
result[file.fullPath] = file;
});
return result;
}
}
module.exports = PresetsFolder;