kira-crud
Version:
Intelligent CRUD Generator for Laravel and Angular
107 lines (94 loc) • 3.72 kB
JavaScript
/**
* Configuration Builder Utility
* Helps build and save CRUD configuration files
*/
const fs = require('fs').promises;
const path = require('path');
const yaml = require('js-yaml');
const chalk = require('chalk');
const ora = require('ora');
/**
* Build a complete model configuration object
* @param {Object} modelInfo - Basic model information
* @param {Array} fields - Fields configuration
* @param {Array} relationships - Relationships configuration
* @param {Object} uiOptions - UI display options
* @param {Object} routeOptions - Routing options
* @param {Object} backendOptions - Backend architecture options
* @returns {Object} Complete configuration object
*/
async function buildConfigObject(modelInfo, fields = [], relationships = [], uiOptions = {}, routeOptions = {}, backendOptions = {}) {
// Load settings to get default architecture
const settingsManager = require('./settings-manager');
const settings = await settingsManager.loadSettings();
const defaultArchitecture = settings.defaults?.backendArchitecture || 'advanced';
// Build basic model configuration
const config = {
backend: {
architecture: backendOptions.architecture || defaultArchitecture
},
model: {
name: modelInfo.modelName || modelInfo.name,
tableName: modelInfo.tableName,
displayName: modelInfo.displayName || modelInfo.modelName || modelInfo.name,
description: modelInfo.description || '',
fields: fields,
relationships: relationships || []
},
ui: {
tableFields: uiOptions.tableFields || fields.slice(0, 4).map(f => f.name),
itemsPerPage: uiOptions.itemsPerPage || 10,
enableSearch: uiOptions.enableSearch !== undefined ? uiOptions.enableSearch : true,
enableFilters: uiOptions.enableFilters !== undefined ? uiOptions.enableFilters : true
},
routes: {
apiPrefix: routeOptions.routePrefix || `api/${modelInfo.tableName}`,
frontendPath: routeOptions.frontendRoute || modelInfo.tableName.replace(/_/g, '-'),
menuTitle: routeOptions.menuTitle || modelInfo.displayName || modelInfo.modelName || modelInfo.name,
menuIcon: routeOptions.menuIcon || 'list'
}
};
return config;
}
/**
* Save configuration to a file
* @param {Object} config - Configuration object
* @param {string} fileName - File name to save as
* @param {string} [directory='examples'] - Directory to save in
* @returns {Promise<string>} Path to saved file
*/
async function saveConfigFile(config, fileName, directory = 'examples') {
const spinner = ora('Saving configuration...').start();
try {
// Ensure directory exists
// Essayer d'abord avec le chemin absolu si directory commence par '/'
const dirPath = directory.startsWith('/')
? directory
: path.join(process.cwd(), directory);
await fs.mkdir(dirPath, { recursive: true });
// Default to YAML format
if (!fileName.endsWith('.yml') && !fileName.endsWith('.yaml') && !fileName.endsWith('.json')) {
fileName += '.yml';
}
const filePath = path.join(dirPath, fileName);
// Generate content based on file type
let content;
if (fileName.endsWith('.json')) {
content = JSON.stringify(config, null, 2);
} else {
content = yaml.dump(config, { lineWidth: 120 });
}
// Write file
await fs.writeFile(filePath, content, 'utf8');
spinner.succeed(`Configuration saved to ${directory}/${fileName}`);
return filePath;
} catch (error) {
spinner.fail('Failed to save configuration');
console.error(chalk.red(`Error: ${error.message}`));
throw error;
}
}
module.exports = {
buildConfigObject,
saveConfigFile
};