UNPKG

fortify2-js

Version:

MOST POWERFUL JavaScript Security Library! Military-grade cryptography + 19 enhanced object methods + quantum-resistant algorithms + perfect TypeScript support. More powerful than Lodash with built-in security.

203 lines (199 loc) 6.78 kB
'use strict'; var fs = require('fs'); var path = require('path'); /** * Configuration Loader for FortifyJS * Loads configuration from various sources with priority order */ class ConfigLoader { /** * Load configuration from file system */ static loadConfig(options = {}) { const { configFile, searchPaths = ConfigLoader.DEFAULT_SEARCH_PATHS, allowedExtensions = [".js", ".ts", ".json", ".mjs"] } = options; // If specific config file is provided, try to load it if (configFile) { const config = ConfigLoader.loadConfigFile(configFile); if (config) { console.log(`✔Loaded configuration from: ${configFile}`); return config; } } // Search for config files in search paths for (const searchPath of searchPaths) { for (const configFileName of ConfigLoader.DEFAULT_CONFIG_FILES) { const configPath = path.join(searchPath, configFileName); if (fs.existsSync(configPath)) { const config = ConfigLoader.loadConfigFile(configPath); if (config) { console.log(`✔Loaded configuration from: ${configPath}`); return config; } } } } return null; } /** * Load configuration from a specific file */ static loadConfigFile(filePath) { try { if (!fs.existsSync(filePath)) { return null; } const ext = filePath.split('.').pop()?.toLowerCase(); switch (ext) { case 'json': return ConfigLoader.loadJsonConfig(filePath); case 'js': case 'mjs': return ConfigLoader.loadJsConfig(filePath); case 'ts': return ConfigLoader.loadTsConfig(filePath); default: // Try to parse as JSON for .fortifyrc files return ConfigLoader.loadJsonConfig(filePath); } } catch (error) { console.warn(` Failed to load config from ${filePath}: ${error.message}`); return null; } } /** * Load JSON configuration */ static loadJsonConfig(filePath) { try { const content = fs.readFileSync(filePath, 'utf8'); return JSON.parse(content); } catch (error) { console.warn(` Failed to parse JSON config ${filePath}: ${error.message}`); return null; } } /** * Load JavaScript configuration */ static loadJsConfig(filePath) { try { // Clear require cache to allow hot reloading delete require.cache[require.resolve(filePath)]; const config = require(filePath); // Handle both default export and named export return config.default || config; } catch (error) { console.warn(` Failed to load JS config ${filePath}: ${error.message}`); return null; } } /** * Load TypeScript configuration (requires ts-node or similar) */ static loadTsConfig(filePath) { try { // Try to register TypeScript if not already registered try { require('ts-node/register'); } catch { // ts-node not available, try tsx try { require('tsx/cjs'); } catch { console.warn(` TypeScript config found but no TypeScript loader available. Install ts-node or tsx.`); return null; } } // Clear require cache delete require.cache[require.resolve(filePath)]; const config = require(filePath); // Handle both default export and named export return config.default || config; } catch (error) { console.warn(` Failed to load TS config ${filePath}: ${error.message}`); return null; } } /** * Merge configurations with priority order */ static mergeConfigs(baseConfig, ...configs) { let merged = { ...baseConfig }; for (const config of configs) { if (config) { merged = ConfigLoader.deepMerge(merged, config); } } return merged; } /** * Deep merge two configuration objects */ static deepMerge(target, source) { const result = { ...target }; for (const key in source) { if (source.hasOwnProperty(key)) { if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key]) && typeof target[key] === 'object' && target[key] !== null && !Array.isArray(target[key])) { result[key] = ConfigLoader.deepMerge(target[key], source[key]); } else { result[key] = source[key]; } } } return result; } /** * Validate configuration */ static validateConfig(config) { const errors = []; // Validate file watcher configuration if (config.fileWatcher) { const fw = config.fileWatcher; if (fw.typescript?.runner && typeof fw.typescript.runner !== 'string') { errors.push('fileWatcher.typescript.runner must be a string'); } if (fw.typescript?.runnerArgs && !Array.isArray(fw.typescript.runnerArgs)) { errors.push('fileWatcher.typescript.runnerArgs must be an array'); } if (fw.extensions && !Array.isArray(fw.extensions)) { errors.push('fileWatcher.extensions must be an array'); } if (fw.watchPaths && !Array.isArray(fw.watchPaths)) { errors.push('fileWatcher.watchPaths must be an array'); } } return { valid: errors.length === 0, errors }; } } ConfigLoader.DEFAULT_CONFIG_FILES = [ "fortify.config.js", "fortify.config.ts", "fortify.config.json", "fortify.config.mjs", ".fortifyrc", ".fortifyrc.json", ".fortifyrc.js", ]; ConfigLoader.DEFAULT_SEARCH_PATHS = [ process.cwd(), path.join(process.cwd(), "config"), path.join(process.cwd(), ".config"), ]; exports.ConfigLoader = ConfigLoader; //# sourceMappingURL=ConfigLoader.js.map