UNPKG

kira-crud

Version:

Intelligent CRUD Generator for Laravel and Angular

107 lines (94 loc) 3.72 kB
/** * 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 };