aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
112 lines (94 loc) • 3.23 kB
JavaScript
/**
* @fileoverview Factory for merge strategies
* @module merger/strategies
*/
const path = require('path');
const { ReplaceMerger } = require('./replace-merger.js');
const { EnvMerger } = require('./env-merger.js');
const { MarkdownMerger } = require('./markdown-merger.js');
const { YamlMerger } = require('./yaml-merger.js');
// Strategy registry - maps file extensions to merger classes
const strategies = new Map();
// Special file names that have dedicated strategies
const fileNameStrategies = new Map();
// Register built-in strategies
// .env files
fileNameStrategies.set('.env', EnvMerger);
fileNameStrategies.set('.env.local', EnvMerger);
fileNameStrategies.set('.env.example', EnvMerger);
// Markdown files
strategies.set('.md', MarkdownMerger);
// YAML files (Story INS-4.7)
strategies.set('.yaml', YamlMerger);
strategies.set('.yml', YamlMerger);
/**
* Register a merge strategy for a file extension
* @param {string} extension - File extension (e.g., '.md', '.env')
* @param {typeof import('./base-merger.js').BaseMerger} MergerClass - Merger class
*/
function registerStrategy(extension, MergerClass) {
strategies.set(extension.toLowerCase(), MergerClass);
}
/**
* Register a merge strategy for a specific filename
* @param {string} filename - Exact filename (e.g., '.env')
* @param {typeof import('./base-merger.js').BaseMerger} MergerClass - Merger class
*/
function registerFileNameStrategy(filename, MergerClass) {
fileNameStrategies.set(filename.toLowerCase(), MergerClass);
}
/**
* Get the appropriate merge strategy for a file
* @param {string} filePath - Path to the file
* @returns {import('./base-merger.js').BaseMerger} Merger instance
*/
function getMergeStrategy(filePath) {
const basename = path.basename(filePath).toLowerCase();
const ext = path.extname(filePath).toLowerCase();
// First check for exact filename match (e.g., '.env')
if (fileNameStrategies.has(basename)) {
const MergerClass = fileNameStrategies.get(basename);
return new MergerClass();
}
// Then check for extension match (e.g., '.md')
if (strategies.has(ext)) {
const MergerClass = strategies.get(ext);
return new MergerClass();
}
// Fallback to replace merger
return new ReplaceMerger();
}
/**
* Check if a specific merge strategy exists for a file
* @param {string} filePath - Path to the file
* @returns {boolean} True if a non-fallback strategy exists
*/
function hasMergeStrategy(filePath) {
const basename = path.basename(filePath).toLowerCase();
const ext = path.extname(filePath).toLowerCase();
return fileNameStrategies.has(basename) || strategies.has(ext);
}
/**
* Get list of supported file types for merging
* @returns {Object} Object with extensions and filenames arrays
*/
function getSupportedTypes() {
return {
extensions: Array.from(strategies.keys()),
filenames: Array.from(fileNameStrategies.keys()),
};
}
// Export classes for direct use if needed
const { BaseMerger } = require('./base-merger.js');
module.exports = {
getMergeStrategy,
hasMergeStrategy,
registerStrategy,
registerFileNameStrategy,
getSupportedTypes,
BaseMerger,
ReplaceMerger,
EnvMerger,
MarkdownMerger,
YamlMerger,
};