custom-menu-cli
Version:
Menu interativo baseado em JSON para execução de comandos no terminal
99 lines (88 loc) • 3.33 kB
JavaScript
const fs = require('fs').promises;
const path = require('path');
const chalk = require('chalk');
const { validateMenuOption } = require('./menuValidator.js'); // Importar o validador
const defaultMenu = {
"name": "Example Menu",
"description": "This is a default example menu. Create a 'menu.json' to customize.",
"options": [
{
"id": "hello",
"name": "Say Hello",
"type": "action",
"command": "echo 'Hello, World!'",
"confirm": false
}
]
};
async function buildMenuOptions(dir) {
const entries = await fs.readdir(dir, { withFileTypes: true });
const options = [];
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory()) {
const subOptions = await buildMenuOptions(fullPath);
options.push({
id: entry.name,
name: `=> ${entry.name.toUpperCase()}`,
type: 'navigation',
options: subOptions
});
} else if (entry.isFile() && entry.name.endsWith('.json')) {
const fileContent = await fs.readFile(fullPath, 'utf-8');
let option;
try {
option = JSON.parse(fileContent);
} catch (parseError) {
console.error(chalk.red(`Erro: Arquivo JSON malformado em: ${fullPath}`));
console.error(chalk.red(`Detalhes: ${parseError.message}`));
process.exit(1);
}
validateMenuOption(option, fullPath); // Chamar o validador
options.push(option);
}
}
return options;
}
async function loadMenuConfig(menuPath = null) {
let data;
let finalPath = menuPath;
// If menuPath is not provided, check command line arguments
if (!finalPath) {
const args = process.argv.slice(2);
finalPath = args[0];
}
if (finalPath) {
try {
const stats = await fs.stat(finalPath);
if (stats.isDirectory()) {
data = {
name: "Dynamic Menu",
description: `Menu generated from folder: ${finalPath}`,
options: await buildMenuOptions(finalPath)
};
} else { // It's a file
data = JSON.parse(await fs.readFile(finalPath, 'utf-8'));
validateMenuOption(data, finalPath); // Validar menu de arquivo único também
}
} catch (error) {
console.log(chalk.red(`Erro ao processar o caminho: ${finalPath}`));
console.error(error);
process.exit(1);
}
} else if (fs.existsSync('./menu.json')) { // This part remains sync for now
try {
data = JSON.parse(fs.readFileSync('./menu.json', 'utf-8'));
validateMenuOption(data, './menu.json'); // Validar menu.json padrão
} catch (error) {
console.log(chalk.red(`Erro ao analisar o arquivo JSON: ./menu.json`));
console.error(error);
process.exit(1);
}
} else {
console.log(chalk.yellow("Nenhum 'menu.json' encontrado. Carregando menu de exemplo."));
data = defaultMenu;
}
return data;
}
module.exports = { loadMenuConfig };