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.
210 lines (206 loc) • 7.08 kB
JavaScript
;
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 (configFile &&
!allowedExtensions.some((ext) => configFile.endsWith(ext))) {
console.warn(`Config file ${configFile} has unsupported extension. Allowed extensions: ${allowedExtensions.join(", ")}`);
return null;
}
// 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