// API Documentation configuration management composable const apiDocsConfig = ref({ // Basic Information title: 'Corrad AF 2024 API Platform', description: 'Complete API reference for the Corrad AF 2024 API Platform project', version: '2.0.0', // OpenAPI Source Configuration sourceType: 'default', // 'default', 'collections', 'custom' openApiUrl: '/openapi.json', // Default main OpenAPI JSON file // Theme Configuration theme: 'light', // light, dark, auto // Features Configuration showSidebar: true, defaultExpandedTags: true, showSearch: true, // Advanced Configuration metaData: { title: 'Corrad AF 2024 API Documentation', description: 'Complete API reference for all endpoints in the Corrad AF 2024 platform', favicon: '/favicon.ico' }, // Display Options groupByTags: true, showParameters: true, showRequestBody: true, showResponses: true, showExamples: true, // Contact Information contact: { name: 'API Support', email: 'support@corradaf.com', url: 'https://corradaf.com' } }); // Available source types const availableSourceTypes = [ { value: 'default', label: 'Default OpenAPI', description: 'Main OpenAPI specification', url: '/openapi.json' }, { value: 'collections', label: 'Generated from Collections', description: 'Auto-generated from API collections', url: '/openapi-coll.json' }, { value: 'custom', label: 'Custom JSON', description: 'Custom edited OpenAPI specification', url: '/openapi-custom.json' } ]; // Available theme options const availableThemes = [ { value: 'light', label: 'Light', description: 'Light theme' }, { value: 'dark', label: 'Dark', description: 'Dark theme' }, { value: 'auto', label: 'Auto', description: 'Follow system preference' } ]; // Configuration loaded flag let configLoaded = false; // Load configuration from localStorage const loadApiDocsConfig = () => { if (configLoaded) return; // Avoid loading multiple times try { const saved = localStorage.getItem('api-docs-config'); if (saved) { const parsed = JSON.parse(saved); // Merge with defaults to ensure all properties exist apiDocsConfig.value = { ...apiDocsConfig.value, ...parsed }; } configLoaded = true; } catch (error) { console.error('Failed to load API docs configuration:', error); } }; // Save configuration to localStorage const saveApiDocsConfig = () => { try { localStorage.setItem('api-docs-config', JSON.stringify(apiDocsConfig.value)); return true; } catch (error) { console.error('Failed to save API docs configuration:', error); return false; } }; // Update specific configuration const updateApiDocsConfig = (updates) => { apiDocsConfig.value = { ...apiDocsConfig.value, ...updates }; // Update OpenAPI URL based on source type if (updates.sourceType) { const sourceConfig = availableSourceTypes.find(s => s.value === updates.sourceType); if (sourceConfig) { apiDocsConfig.value.openApiUrl = sourceConfig.url; } } return saveApiDocsConfig(); }; // Update source type and corresponding URL const updateSourceType = (sourceType) => { const sourceConfig = availableSourceTypes.find(s => s.value === sourceType); if (sourceConfig) { apiDocsConfig.value.sourceType = sourceType; apiDocsConfig.value.openApiUrl = sourceConfig.url; return saveApiDocsConfig(); } return false; }; // Reset to defaults const resetApiDocsConfig = () => { apiDocsConfig.value = { title: 'Corrad AF 2024 API Platform', description: 'Complete API reference for the Corrad AF 2024 API Platform project', version: '2.0.0', sourceType: 'default', openApiUrl: '/openapi.json', theme: 'light', showSidebar: true, defaultExpandedTags: true, showSearch: true, metaData: { title: 'Corrad AF 2024 API Documentation', description: 'Complete API reference for all endpoints in the Corrad AF 2024 platform', favicon: '/favicon.ico' }, groupByTags: true, showParameters: true, showRequestBody: true, showResponses: true, showExamples: true, contact: { name: 'API Support', email: 'support@corradaf.com', url: 'https://corradaf.com' } }; configLoaded = false; return saveApiDocsConfig(); }; // Generate API docs configuration object const getApiDocsConfiguration = () => { // Ensure config is loaded before generating if (!configLoaded && process.client) { loadApiDocsConfig(); } const config = apiDocsConfig.value; // Ensure the URL is valid and use default if not let openApiUrl = config.openApiUrl; if (!openApiUrl || typeof openApiUrl !== 'string') { console.warn('Invalid OpenAPI URL in config, using default'); openApiUrl = '/openapi.json'; } // Make sure URL starts with / or http(s) if (!openApiUrl.startsWith('/') && !openApiUrl.startsWith('http')) { openApiUrl = `/${openApiUrl}`; } return { url: openApiUrl, title: config.title || 'API Documentation', description: config.description || '', version: config.version || '1.0.0', theme: config.theme || 'light', showSidebar: Boolean(config.showSidebar), defaultExpandedTags: Boolean(config.defaultExpandedTags), showSearch: Boolean(config.showSearch), groupByTags: Boolean(config.groupByTags), showParameters: Boolean(config.showParameters), showRequestBody: Boolean(config.showRequestBody), showResponses: Boolean(config.showResponses), showExamples: Boolean(config.showExamples), metaData: { title: config.metaData?.title || 'API Documentation', description: config.metaData?.description || 'Complete API reference', favicon: config.metaData?.favicon || '/favicon.ico' }, contact: config.contact || {} }; }; // Auto-load configuration on client side if (process.client) { loadApiDocsConfig(); } export const useScalarConfig = () => { return { // State (keeping the same export name for compatibility) scalarConfig: readonly(apiDocsConfig), availableThemes, availableSourceTypes, // Methods (keeping the same names for compatibility) loadScalarConfig: loadApiDocsConfig, saveScalarConfig: saveApiDocsConfig, updateScalarConfig: updateApiDocsConfig, updateSourceType, resetScalarConfig: resetApiDocsConfig, getScalarConfiguration: getApiDocsConfiguration }; };