Files

78 lines
2.1 KiB
JavaScript

const fs = require('node:fs');
const path = require('node:path');
const isJavaScriptFile = (file) => file.endsWith('.js');
const getCommandFilePaths = (commandsPath) => {
const commandFilePaths = [];
const entries = fs.readdirSync(commandsPath, { withFileTypes: true });
for (const entry of entries) {
const entryPath = path.join(commandsPath, entry.name);
if (entry.isDirectory()) {
commandFilePaths.push(...getCommandFilePaths(entryPath));
continue;
}
if (entry.isFile() && isJavaScriptFile(entry.name)) {
commandFilePaths.push(entryPath);
}
}
return commandFilePaths.sort((left, right) => left.localeCompare(right));
};
const loadCommandModules = (commandsPath) => {
const commandFiles = getCommandFilePaths(commandsPath);
const commands = [];
const invalidCommands = [];
const duplicateCommands = [];
const loadErrors = [];
const commandNames = new Map();
for (const filePath of commandFiles) {
let command;
try {
delete require.cache[require.resolve(filePath)];
command = require(filePath);
} catch (error) {
loadErrors.push({ filePath, error });
continue;
}
const commandName = command?.data?.name;
const isValidCommand =
typeof commandName === 'string' &&
commandName.length > 0 &&
typeof command.execute === 'function';
if (!isValidCommand) {
invalidCommands.push(filePath);
continue;
}
if (commandNames.has(commandName)) {
duplicateCommands.push({
commandName,
filePath,
existingFilePath: commandNames.get(commandName),
});
continue;
}
commandNames.set(commandName, filePath);
commands.push(command);
}
return {
commands,
duplicateCommands,
invalidCommands,
loadErrors,
};
};
module.exports = {
getCommandFilePaths,
loadCommandModules,
};