ubon
Version:
Security scanner for AI-generated React/Next.js and Python apps. Catches hardcoded secrets, accessibility issues, and vulnerabilities that traditional linters miss.
46 lines (45 loc) • 2.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadConfig = loadConfig;
exports.mergeOptions = mergeOptions;
const fs_1 = require("fs");
const path_1 = require("path");
function loadConfig(directory) {
try {
const jsonPath = (0, path_1.join)(directory, 'ubon.config.json');
if ((0, fs_1.existsSync)(jsonPath)) {
const data = JSON.parse((0, fs_1.readFileSync)(jsonPath, 'utf-8'));
return data;
}
const jsPath = (0, path_1.join)(directory, 'ubon.config.js');
if ((0, fs_1.existsSync)(jsPath)) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const data = require(jsPath);
return (data && data.default) ? data.default : data;
}
const pkgPath = (0, path_1.join)(directory, 'package.json');
if ((0, fs_1.existsSync)(pkgPath)) {
const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf-8'));
if (pkg.ubon && typeof pkg.ubon === 'object') {
return pkg.ubon;
}
}
}
catch {
// ignore config errors, fall back to defaults/CLI
}
return {};
}
function mergeOptions(config, cli) {
const merged = { ...config, ...cli };
// For arrays, prefer CLI if provided, else config
merged.enabledRules = cli.enabledRules !== undefined ? cli.enabledRules : config.enabledRules;
merged.disabledRules = cli.disabledRules !== undefined ? cli.disabledRules : config.disabledRules;
merged.changedFiles = cli.changedFiles !== undefined ? cli.changedFiles : config.changedFiles;
// For numbers and booleans, CLI undefined means use config
merged.minConfidence = cli.minConfidence !== undefined ? cli.minConfidence : config.minConfidence;
merged.useBaseline = cli.useBaseline !== undefined ? cli.useBaseline : config.useBaseline;
merged.baselinePath = cli.baselinePath !== undefined ? cli.baselinePath : config.baselinePath;
merged.failOn = cli.failOn !== undefined ? cli.failOn : config.failOn;
return merged;
}