UNPKG

@ziul285/gitleaks

Version:

A custom Gitleaks-like scanner for detecting sensitive data.

122 lines (101 loc) 3.46 kB
const fs = require("node:fs"); const path = require("node:path"); const {defaultPatterns} = require("./patterns"); const {validateField, isArray, isObject} = require("../utils/validator"); /** * Loads the configuration for gitleaks with enhanced error handling and warnings for invalid keys. * @returns {Object} The validated configuration object. */ const loadConfig = () => { const configPath = path.join(process.cwd(), ".gitleaksrc.json"); let config = { customPatterns: [], ignoredPatterns: [], ignorePaths: [ ".git", "node_modules", "package.json", "package-lock.json", ], }; const validKeys = [ "customPatterns", "ignoredPatterns", "ignorePaths", "ignoreExtensions", "maxFileSizeKb", "includePatterns", ]; if (!fs.existsSync(configPath)) { return {...config, defaultPatterns}; } try { const userConfig = JSON.parse(fs.readFileSync(configPath, "utf-8")); validateField(userConfig, "userConfig", isObject); const unknownKeys = Object.keys(userConfig).filter( (key) => !validKeys.includes(key), ); if (unknownKeys.length > 0) { console.warn( `[WARN] Unknown keys in configuration: ${unknownKeys.join(", ")}. These keys will be ignored.`, ); } if (userConfig.customPatterns) { validateField(userConfig.customPatterns, "customPatterns", isArray); } if (userConfig.ignoredPatterns) { validateField( userConfig.ignoredPatterns, "ignoredPatterns", isArray, ); } if (userConfig.ignorePaths) { validateField(userConfig.ignorePaths, "ignorePaths", isArray); } if (userConfig.ignoreExtensions) { validateField( userConfig.ignoreExtensions, "ignoreExtensions", isArray, ); } if ( userConfig.maxFileSizeKb !== undefined && typeof userConfig.maxFileSizeKb !== "number" ) { throw new Error("'maxFileSizeKb' must be a number."); } if (userConfig.includePatterns) { validateField( userConfig.includePatterns, "includePatterns", isArray, ); } config = {...config, ...userConfig}; const invalidIgnoredPatterns = config.ignoredPatterns.filter( (key) => !Object.keys(defaultPatterns).includes(key), ); if (invalidIgnoredPatterns.length > 0) { console.warn( `[WARN] Invalid keys in 'ignoredPatterns': ${invalidIgnoredPatterns.join( ", ", )}. These keys will be ignored.`, ); } const filteredPatterns = Object.entries(defaultPatterns).reduce( (acc, [key, value]) => { if (!config.ignoredPatterns.includes(key)) { acc[key] = value; } return acc; }, {}, ); return {...config, defaultPatterns: filteredPatterns}; } catch (error) { throw new Error(`Failed to load configuration: ${error.message}`); } }; module.exports = {loadConfig};