78 lines
2.1 KiB
JavaScript
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,
|
|
};
|