@prolaxu/galaxy-api-tool
Version:
CLI tool for generating Galaxy API files (Controllers, Resources, Vue components)
174 lines (151 loc) • 7.08 kB
JavaScript
const { Command } = require('commander');
const chalk = require('chalk');
const path = require('path');
const Generator = require('../lib/generator');
const program = new Command();
program
.name('galaxy-api-tool')
.description('CLI tool for generating Galaxy API files')
.version('1.0.0');
// Generate API files (Controller + Request + Resource)
program
.command('gen:api <modelName>')
.description('Generate Galaxy API files (Controller, Request, Resource)')
.option('-p, --path <path>', 'Custom output path', process.cwd())
.option('--test', 'Generate in tests folder for testing')
.action(async (modelName, options) => {
console.log(chalk.blue('🚀 Generating Galaxy API files...'));
try {
const outputPath = options.test ? path.join(options.path, 'tests') : options.path;
const generator = new Generator(outputPath);
await generator.generateApi(modelName);
const basePath = options.test ? 'tests/' : '';
console.log(chalk.green('✅ Generated:'));
console.log(` - Controller: ${basePath}src/GalaxyAPI/Controllers/${modelName}Controller.php`);
console.log(` - Request: ${basePath}src/GalaxyAPI/Requests/${modelName}Request.php`);
console.log(` - Resource: ${basePath}src/GalaxyAPI/Resources/${modelName}Resource.php`);
} catch (error) {
console.error(chalk.red('❌ Error:'), error.message);
process.exit(1);
}
});
// Generate API files without Request (uses EmptyRequest)
program
.command('gen:api-empty <modelName>')
.description('Generate Galaxy API files without Request validation')
.option('-p, --path <path>', 'Custom output path', process.cwd())
.option('--test', 'Generate in tests folder for testing')
.action(async (modelName, options) => {
console.log(chalk.blue('🚀 Generating Galaxy API files (empty)...'));
try {
const outputPath = options.test ? path.join(options.path, 'tests') : options.path;
const generator = new Generator(outputPath);
await generator.generateApiEmpty(modelName);
const basePath = options.test ? 'tests/' : '';
console.log(chalk.green('✅ Generated:'));
console.log(` - Controller: ${basePath}src/GalaxyAPI/Controllers/${modelName}Controller.php`);
console.log(` - Resource: ${basePath}src/GalaxyAPI/Resources/${modelName}Resource.php`);
} catch (error) {
console.error(chalk.red('❌ Error:'), error.message);
process.exit(1);
}
});
// Generate Vue.js CRUD views
program
.command('gen:views <modelInput>')
.description('Generate Galaxy CRUD views (Vue components and Pinia store)')
.option('-p, --path <path>', 'Custom output path', process.cwd())
.option('--test', 'Generate in tests folder for testing')
.action(async (modelInput, options) => {
console.log(chalk.blue('🚀 Generating Galaxy CRUD views...'));
try {
const outputPath = options.test ? path.join(options.path, 'tests') : options.path;
const generator = new Generator(outputPath);
const result = await generator.generateViews(modelInput);
const basePath = options.test ? 'tests/' : '';
console.log(chalk.green(`✅ Generated CRUD files for ${result.modelName}:`));
if (result.groupFolder) {
console.log(` 📁 Group: ${result.groupFolder}`);
}
console.log(` 📁 Store: ${basePath}${result.storePath}`);
console.log(` 📝 Form: ${basePath}${result.formPath}`);
console.log(` 📋 List: ${basePath}${result.listPath}`);
console.log(` 🔽 Select: ${basePath}${result.selectPath}`);
console.log('');
console.log(chalk.yellow('📝 Next steps:'));
console.log(` 1. Update the columns array in ${result.modelName}ListComponent.vue`);
console.log(` 2. Add form fields to ${result.modelName}Form.vue`);
console.log(' 3. Import and use components in your routes/pages');
if (result.groupFolder) {
console.log(` 4. API endpoint: v2/tenant/${result.fullLowerPath}`);
}
} catch (error) {
console.error(chalk.red('❌ Error:'), error.message);
process.exit(1);
}
});
// Generate everything (API + Views)
program
.command('gen:all <modelInput>')
.description('Generate all Galaxy files (API + CRUD views)')
.option('-p, --path <path>', 'Custom output path', process.cwd())
.option('--empty', 'Use empty request for API generation', false)
.option('--test', 'Generate in tests folder for testing')
.action(async (modelInput, options) => {
console.log(chalk.blue('🚀 Generating all Galaxy files...'));
try {
const outputPath = options.test ? path.join(options.path, 'tests') : options.path;
const generator = new Generator(outputPath);
// Extract model name for API generation
const modelName = modelInput.includes('/')
? modelInput.split('/').pop()
: modelInput;
// Generate API files
if (options.empty) {
await generator.generateApiEmpty(modelName);
} else {
await generator.generateApi(modelName);
}
// Generate Views
const result = await generator.generateViews(modelInput);
const basePath = options.test ? 'tests/' : '';
console.log(chalk.green('✅ Generated all files:'));
console.log(chalk.cyan(' API Files:'));
console.log(` - Controller: ${basePath}src/GalaxyAPI/Controllers/${modelName}Controller.php`);
if (!options.empty) {
console.log(` - Request: ${basePath}src/GalaxyAPI/Requests/${modelName}Request.php`);
}
console.log(` - Resource: ${basePath}src/GalaxyAPI/Resources/${modelName}Resource.php`);
console.log(chalk.cyan(' CRUD Files:'));
if (result.groupFolder) {
console.log(` 📁 Group: ${result.groupFolder}`);
}
console.log(` 📁 Store: ${basePath}${result.storePath}`);
console.log(` 📝 Form: ${basePath}${result.formPath}`);
console.log(` 📋 List: ${basePath}${result.listPath}`);
console.log(` 🔽 Select: ${basePath}${result.selectPath}`);
console.log('');
console.log(chalk.yellow('📝 Next steps:'));
console.log(` 1. Update the columns array in ${result.modelName}ListComponent.vue`);
console.log(` 2. Add form fields to ${result.modelName}Form.vue`);
console.log(' 3. Import and use components in your routes/pages');
if (result.groupFolder) {
console.log(` 4. API endpoint: v2/tenant/${result.fullLowerPath}`);
}
} catch (error) {
console.error(chalk.red('❌ Error:'), error.message);
process.exit(1);
}
});
// Handle unknown commands
program.on('command:*', () => {
console.error(chalk.red('❌ Invalid command: %s'), program.args.join(' '));
console.log('See --help for a list of available commands.');
process.exit(1);
});
// Show help if no command provided
if (!process.argv.slice(2).length) {
program.outputHelp();
}
program.parse();