@confytome/core
Version:
Core plugin system and OpenAPI 3.0.3 generator from JSDoc comments. Plugin registry, service layer, and CLI for extensible API documentation generation.
90 lines (76 loc) • 2.6 kB
JavaScript
/**
* Configuration Merger Utility
*
* Simple configuration merging without temporary file creation.
* Merges CLI options with configuration files in memory only.
*/
import fs from 'node:fs';
export class ConfigMerger {
/**
* Merge CLI options with a configuration file
* @param {string} configPath - Path to the base configuration file
* @param {Object} cliOptions - CLI options to merge/override
* @returns {Object} Merged configuration object
*/
static mergeWithConfig(configPath, cliOptions) {
// Read the base configuration
let baseConfig = {};
if (fs.existsSync(configPath)) {
try {
const configContent = fs.readFileSync(configPath, 'utf8');
baseConfig = JSON.parse(configContent);
} catch (error) {
throw new Error(`Failed to parse config file ${configPath}: ${error.message}`);
}
}
// Create and return merged configuration
return this.mergeConfigurations(baseConfig, cliOptions);
}
/**
* Merge configurations with CLI options taking precedence
* @param {Object} baseConfig - Base configuration from file
* @param {Object} cliOptions - CLI options to merge
* @returns {Object} Merged configuration
*/
static mergeConfigurations(baseConfig, cliOptions) {
const merged = { ...baseConfig };
// Simple option mappings (CLI option -> config property)
const optionMappings = {
output: 'outputDir',
spec: 'specPath',
files: 'routeFiles',
serverConfig: 'serverConfig',
noBrand: 'excludeBrand'
};
// Apply CLI overrides
for (const [cliKey, configKey] of Object.entries(optionMappings)) {
if (cliOptions[cliKey] !== undefined && cliOptions[cliKey] !== null) {
merged[configKey] = cliOptions[cliKey];
}
}
// Handle Commander.js --no-brand option
if (cliOptions.brand === false) {
merged.excludeBrand = true;
}
// Basic validation
if (merged.routeFiles && !Array.isArray(merged.routeFiles)) {
merged.routeFiles = [merged.routeFiles];
}
return merged;
}
/**
* Extract CLI options from commander options object
* @param {Object} commanderOptions - Commander.js options object
* @returns {Object} Cleaned CLI options
*/
static extractCliOptions(commanderOptions) {
const cleaned = {};
// Skip commander.js internal properties and undefined values
for (const [key, value] of Object.entries(commanderOptions)) {
if (!key.startsWith('_') && value !== undefined) {
cleaned[key] = value;
}
}
return cleaned;
}
}