{"version":3,"sources":["../src/index.ts","../src/core/analysisBuilder.ts","../src/core/mainScanner.ts","../src/core/extractors/stringExtractorUniversal.ts","../src/core/extractors/stringExtractor.ts","../src/core/patternLoader.ts","../src/core/helpers/secretKeyGenerator.ts","../src/core/detectors/patternScanner.ts","../src/core/detectors/plugins/RegexBaseDetector.ts","../src/core/detectors/plugins/database/MongoDbDetector.ts","../src/core/detectors/plugins/database/PostgreSQLDetector.ts","../src/core/detectors/plugins/database/MySQLDetector.ts","../src/core/detectors/plugins/database/RedisDetector.ts","../src/core/detectors/plugins/database/ElasticsearchDetector.ts","../src/core/detectors/plugins/database/FirebaseDetector.ts","../src/core/detectors/plugins/database/SupabaseDetector.ts","../src/core/detectors/plugins/database/GoogleCloudStorageDetector.ts","../src/core/detectors/plugins/database/CloudantDetector.ts","../src/core/detectors/plugins/messages/SendGridDetector.ts","../src/core/detectors/plugins/messages/SlackDetector.ts","../src/core/detectors/plugins/messages/WhatsAppCloudDetector.ts","../src/core/detectors/plugins/messages/VonageDetector.ts","../src/core/detectors/plugins/messages/PlivoDetector.ts","../src/core/detectors/plugins/messages/MailchimpDetector.ts","../src/core/detectors/plugins/messages/PostmarkDetector.ts","../src/core/detectors/plugins/messages/ZoomApiDetector.ts","../src/core/detectors/plugins/messages/SmtpGenericDetector.ts","../src/core/detectors/plugins/messages/DiscordBotTokenDetector.ts","../src/core/detectors/plugins/messages/MailgunDetector.ts","../src/core/detectors/plugins/identity/FirebaseAuthDetector.ts","../src/core/detectors/plugins/identity/OktaDetector.ts","../src/core/detectors/plugins/identity/ClerkDetector.ts","../src/core/detectors/plugins/identity/SuperTokensDetector.ts","../src/core/detectors/plugins/identity/Auth0Detector.ts","../src/core/detectors/plugins/NpmTokenDetector.ts","../src/core/detectors/plugins/security/JenkinsDetector.ts","../src/core/detectors/plugins/security/GitHubActionsDetector.ts","../src/core/detectors/plugins/security/TerraformCloudDetector.ts","../src/core/detectors/plugins/security/DroneCiDetector.ts","../src/core/detectors/plugins/security/PulumiDetector.ts","../src/core/detectors/plugins/security/BuddyCiDetector.ts","../src/core/detectors/plugins/security/GitLabCiDetector.ts","../src/core/detectors/plugins/security/CodefreshDetector.ts","../src/core/detectors/plugins/security/TravisCiDetector.ts","../src/core/detectors/plugins/security/CircleCiDetector.ts","../src/core/detectors/plugins/security/BitbucketCiDetector.ts","../src/core/detectors/plugins/TwilioKeyDetector.ts","../src/core/detectors/plugins/JwtTokenDetector.ts","../src/core/detectors/plugins/IbmDetector.ts","../src/core/detectors/plugins/AWSDetector.ts","../src/core/detectors/plugins/logs/NewRelicDetector.ts","../src/core/detectors/plugins/logs/SentryDetector.ts","../src/core/detectors/plugins/logs/MixpanelDetector.ts","../src/core/detectors/plugins/logs/AmplitudeDetector.ts","../src/core/detectors/plugins/logs/LogtailDetector.ts","../src/core/detectors/plugins/logs/DatadogDetector.ts","../src/core/detectors/plugins/ai/ReplicateDetector.ts","../src/core/detectors/plugins/ai/VespaDetector.ts","../src/core/detectors/plugins/ai/VertexAIDetector.ts","../src/core/detectors/plugins/ai/BasetenDetector.ts","../src/core/detectors/plugins/ai/AnthropicDetector.ts","../src/core/detectors/plugins/ai/StabilityAIDetector.ts","../src/core/detectors/plugins/ai/WeaviateDetector.ts","../src/core/detectors/plugins/ai/LangSmithDetector.ts","../src/core/detectors/plugins/ai/OpenAIDetector.ts","../src/core/detectors/plugins/ai/ChromaDetector.ts","../src/core/detectors/plugins/ai/HuggingFaceDetector.ts","../src/core/detectors/plugins/ai/LangChainDetector.ts","../src/core/detectors/plugins/ai/MistralDetector.ts","../src/core/detectors/plugins/ai/PineconeDetector.ts","../src/core/detectors/plugins/ai/QdrantDetector.ts","../src/core/detectors/plugins/ai/CohereDetector.ts","../src/core/detectors/plugins/ai/PerplexityDetector.ts","../src/core/detectors/plugins/deployment/BitbucketTokenDetector.ts","../src/core/detectors/plugins/deployment/CircleCITokenDetector.ts","../src/core/detectors/plugins/deployment/AzureDevOpsDetector.ts","../src/core/detectors/plugins/cloud/NetlifyDetector.ts","../src/core/detectors/plugins/cloud/VercelDetector.ts","../src/core/detectors/plugins/cloud/DigitalOceanDetector.ts","../src/core/detectors/plugins/cloud/GcpKeyDetector.ts","../src/core/detectors/plugins/cloud/HerokuDetector.ts","../src/core/detectors/plugins/cloud/CloudflareDetector.ts","../src/core/detectors/plugins/cloud/RailwayDetector.ts","../src/core/detectors/plugins/cloud/AlibabaCloudDetector.ts","../src/core/detectors/plugins/cloud/OracleCloudDetector.ts","../src/core/detectors/plugins/cloud/AwsKeyDetector.ts","../src/core/detectors/plugins/cloud/IbmCloudDetector.ts","../src/core/detectors/plugins/cloud/RenderDetector.ts","../src/core/detectors/plugins/cloud/AzureKeyDetector.ts","../src/core/detectors/plugins/PrivateKeyDetector.ts","../src/core/detectors/plugins/AzureDetector.ts","../src/core/detectors/plugins/SendgridDetector.ts","../src/core/detectors/plugins/GitLabTokenDetector.ts","../src/core/detectors/plugins/SquareOAuthDetector.ts","../src/core/detectors/plugins/saas/SaasquatchDetector.ts","../src/core/detectors/plugins/saas/SegmentDetector.ts","../src/core/detectors/plugins/saas/ImgixDetector.ts","../src/core/detectors/plugins/saas/CalendlyDetector.ts","../src/core/detectors/plugins/saas/IntercomDetector.ts","../src/core/detectors/plugins/saas/LinearDetector.ts","../src/core/detectors/plugins/saas/PosthogDetector.ts","../src/core/detectors/plugins/saas/CrispDetector.ts","../src/core/detectors/plugins/saas/AlgoliaDetector.ts","../src/core/detectors/plugins/saas/CloudinaryDetector.ts","../src/core/detectors/plugins/saas/FathomDetector.ts","../src/core/detectors/plugins/saas/TypeformDetector.ts","../src/core/detectors/plugins/saas/StripeCliDetector.ts","../src/core/detectors/plugins/SoftlayerDetector.ts","../src/core/detectors/plugins/GitHubTokenDetector.ts","../src/core/detectors/plugins/StripeDetector.ts","../src/core/detectors/plugins.ts","../src/core/detectors/pluginScanner.ts","../src/core/detectors/keywordDetector.ts"],"sourcesContent":["import { createAnalysis } from \"./core/analysisBuilder.js\";\nimport { scanProject } from \"./core/mainScanner.js\";\n\nexport {createAnalysis, scanProject};","// src/core/analysisBuilder.ts\n\nimport { Analysis, Detection } from './models/Analysis.js'\nimport { SecretMetadata } from './mainScanner.js'; // tu interfaz final de detecciones\n// o desde donde la definas\nimport dayjs from 'dayjs'; // si quieres formatear la fecha\nimport path from 'path';\nimport os from 'os';\n\nexport function createAnalysis(\n  secrets: SecretMetadata[],\n  appName: string,\n  engine: string,\n  startTime: number,\n  endTime: number,\n  actions?: Record<string, any>\n): Analysis {\n  // Calcula tiempo en segundos\n  const totalTime = (endTime - startTime) / 1000;\n\n  const detections: Detection[] = secrets.map((s) => {\n    return {\n      id: s.key,                // o un ID que generes\n      name: s.name,\n      confidence: s.confidence,\n      location: s.filePath + ` on line ${s.line}`, // un ejemplo\n      path: shortifyPath(s.filePath) + `:${s.line}`,\n      file: s.filePath,\n      discover: s.discoveredBy, // \"pattern\", \"plugins\", etc.\n      code: s.snippet,          // si tienes snippet\n      highlight: s.snippetLineNumber\n    };\n  });\n\n  const now = dayjs().format(); // formato ISO string\n\n  return {\n    application: appName,\n    date: now,     // string ISO\n    time: totalTime,\n    engine: engine,\n    detections: detections,\n    actions: actions || {}\n  };\n}\n\n/**\n * Transforma una ruta absoluta eliminando el home directory si coincide,\n * y truncando a las últimas 'maxSegments' carpetas con '.../' al inicio.\n * \n * Ejemplo:\n *   /Users/juan/Downloads/content-prompt-builder/app/components/Step1UrlScraper.tsx\n * => .../content-prompt-builder/app/components/Step1UrlScraper.tsx\n */\nexport function shortifyPath(absolutePath: string, maxSegments = 4): string {\n  // 1. Eliminar la carpeta de usuario si el path empieza con ella.\n  const homeDir = os.homedir(); // p.ej. /Users/juan\n  let shortPath = absolutePath;\n\n  // Normalizamos ambos para comparar con independencia de separadores\n  const normalizedAbsolute = path.normalize(absolutePath);\n  const normalizedHome = path.normalize(homeDir);\n\n  // Si la ruta absoluta comienza con la carpeta home (ej: /Users/juan), la recortamos\n  if (normalizedAbsolute.startsWith(normalizedHome)) {\n    // recortamos la parte del home directory\n    shortPath = normalizedAbsolute.slice(normalizedHome.length);\n    // Aseguramos que empiece con separador, p.ej. /Downloads/...\n    if (!shortPath.startsWith(path.sep)) {\n      shortPath = path.sep + shortPath;\n    }\n  }\n\n  // 2. Convertimos en array de segmentos, quitando vacíos\n  const parts = shortPath.split(path.sep).filter(Boolean);\n  // p.ej. [\"Downloads\", \"content-prompt-builder\", \"app\", \"components\", \"Step1UrlScraper.tsx\"]\n\n  // 3. Si excede maxSegments, nos quedamos con las últimas 'maxSegments' y anteponemos '.../'\n  if (parts.length > maxSegments) {\n    const lastSegments = parts.slice(parts.length - maxSegments);\n    return '.../' + lastSegments.join(path.sep);\n  } else {\n    // Sino, devolvemos tal cual (puede empezar con / si venía de home)\n    return shortPath;\n  }\n}\n","// src/core/mainScanner.ts\n\nimport path from 'path';\nimport { extractStringsFromFiles } from './extractors/stringExtractorUniversal.js';\nimport { StringMetadata } from './extractors/stringExtractor.js';\nimport { loadPatterns } from './patternLoader.js';           // Carga rules-stable.yml\nimport { scanWithPatterns } from './detectors/patternScanner.js';\nimport { scanWithPlugins } from './detectors/pluginScanner.js';\n//import { scanByEntropy } from './detectors/entropyScanner.js';\nimport { KeywordDetector } from './detectors/keywordDetector.js';\nimport { SecretKeyGenerator } from './helpers/secretKeyGenerator.js';\nimport fs from 'fs/promises';\n\nconst currentDir = __dirname;\n\n\n// Ejemplo de interfaz para las detecciones\nexport interface SecretMetadata {\n  value: string;        // El literal secreto detectado\n  key: string;          // Key generada (prefijo, hash, etc.)\n  name: string;         // Tipo o nombre del secreto (ej. \"Stripe Access Key\", \"Secret Keyword\", etc.)\n  confidence: string;   // \"high\", \"medium\", ...\n  discoveredBy: string; // \"pattern\", \"plugins\", \"entropy\", \"keyword\"\n  filePath: string;\n  line: number;\n  snippet?: string;\n  snippetLineNumber?: number;\n  highlight?: number;\n  variableName?: string;\n}\n\n/**\n * Aplica el KeywordDetector a las cadenas,\n * revisando si su variableName coincide con patrones sensibles.\n */\nfunction scanWithKeyword(strings: StringMetadata[]): SecretMetadata[] {\n  \n  const keywordDetector = new KeywordDetector();\n  const results: SecretMetadata[] = [];\n\n  for (const s of strings) {\n    // Solo si la cadena tiene un variableName (por ejemplo \"apikey\")\n    if (s.variableName && keywordDetector.isSensitive(s.variableName)) {\n      // Generar la key (similar a .NET)\n      const key = SecretKeyGenerator.generateKey(\n        'keyword',\n        keywordDetector.secretType,\n        s.filePath,\n        s.variableName,    // variableName\n        s.value            // valor de la cadena\n      );\n\n      results.push({\n        value: s.value,\n        key,\n        name: keywordDetector.secretType,\n        confidence: 'high',\n        discoveredBy: 'keyword',\n        filePath: s.filePath,\n        line: s.line,\n        snippet: s.snippet,\n        highlight: s.highlight,\n        snippetLineNumber: s.snippetLineNumber,\n        variableName: s.variableName\n      });\n    }\n  }\n  return results;\n}\n\n/**\n * Unifica varios arrays de SecretMetadata, opcionalmente evitando duplicados.\n */\nfunction unifyFindings(...findingsArrays: SecretMetadata[][]): SecretMetadata[] {\n  const unified: SecretMetadata[] = [];\n  for (const arr of findingsArrays) {\n    for (const item of arr) {\n      // Evitamos duplicados (mismo valor, archivo y línea)\n      if (!unified.some(u => u.value === item.value && u.filePath === item.filePath && u.line === item.line)) {\n        unified.push(item);\n      }\n    }\n  }\n  return unified;\n}\n\nexport async function checkFilesAccess(files: string[]): Promise<{ valid: string[]; invalid: string[] }> {\n  const valid: string[] = [];\n  const invalid: string[] = [];\n\n  for (const filePath of files) {\n    try {\n      const resolvedPath = path.resolve(filePath);\n      await fs.access(resolvedPath, fs.constants.R_OK);\n      valid.push(resolvedPath);\n    } catch {\n      invalid.push(filePath);\n    }\n  }\n\n  return { valid, invalid };\n}\n\n/**\n * Función principal que escanea un conjunto de archivos .js/.ts con todos los detectores:\n * - Patrones (rules-stable.yml)\n * - Plugins (Stripe, Twilio, etc.)\n * - Entropía (Shannon)\n * - KeywordDetector (nombres de variable sensibles)\n */\nexport async function scanProject(filePaths: string[], includeSnippet: boolean = true, currentPath : string = \"./\"): Promise<SecretMetadata[]> {\n\n  const { valid } = await checkFilesAccess(filePaths);\n\n  // 1. Extraer cadenas de todos los archivos\n  const allStrings: StringMetadata[] = extractStringsFromFiles(valid, includeSnippet);\n\n\n  // 2. Patrones (YAML)\n  const patternsPath = path.join(currentDir, `${currentPath}rules/rules-stable.yml`);\n//const patternsPath = path.resolve('./src/rules/rules-stable.yml');  // Ajusta la ruta si corresponde\n  const patterns = loadPatterns(patternsPath);\n  const patternFindings = scanWithPatterns(allStrings, patterns);\n\n  // 3. Plugins (Stripe, Twilio, etc.)\n  const pluginFindings = scanWithPlugins(allStrings);\n\n  // 4. Entropía\n  //const entropyFindings = scanByEntropy(allStrings);\n\n  // 5. KeywordDetector (para variableName)\n  const keywordFindings = scanWithKeyword(allStrings);\n\n  // Unificamos todo en un solo array\n  const allFindings = unifyFindings(patternFindings, pluginFindings, /*entropyFindings,*/ keywordFindings);\n\n  return allFindings;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport Parser from 'tree-sitter';\nimport JavaScript from 'tree-sitter-javascript';\nimport TSParser from 'tree-sitter-typescript';\nconst { typescript: TypeScript, tsx: TSX } = TSParser;\nimport Python from 'tree-sitter-python';\nimport Java from 'tree-sitter-java';\nimport CSharp from 'tree-sitter-c-sharp';\nimport CPP from 'tree-sitter-cpp';\nimport TSParser2 from 'tree-sitter-php';\nconst { php: PHP } = TSParser2;\nimport Swift from 'tree-sitter-swift';\nimport Kotlin from 'tree-sitter-kotlin';\nimport Go from 'tree-sitter-go';\nimport Rust from 'tree-sitter-rust';\nimport Ruby from 'tree-sitter-ruby';\nimport Scala from 'tree-sitter-scala';\n/*import Dart from 'tree-sitter-dart';*/\n//import Shell from 'tree-sitter-bash';\n/*import Perl from 'tree-sitter-perl';\nimport Lua from 'tree-sitter-lua';\nimport Matlab from 'tree-sitter-matlab';\nimport Fortran from 'tree-sitter-fortran';*/\nimport { StringMetadata } from './stringExtractor.js';\nimport { getSnippet } from './stringExtractor.js';\n\nconst LANG_MAP: Record<string, any> = {\n  // JavaScript / Node\n  '.js': JavaScript,\n  '.jsx': JavaScript,\n  '.mjs': JavaScript,\n  '.cjs': JavaScript,\n\n  // TypeScript\n  '.ts': TypeScript,\n  '.tsx': TSX,\n  '.cts': TypeScript,\n  '.mts': TypeScript,\n\n  // Python\n  '.py': Python,\n  '.pyw': Python,\n\n  // Java\n  '.java': Java,\n\n  // C#\n  '.cs': CSharp,\n  '.csx': CSharp,\n  '.razor': CSharp,\n  '.cshtml': CSharp,\n\n  // C++\n  '.cpp': CPP,\n  '.cxx': CPP,\n  '.cc': CPP,\n  '.hpp': CPP,\n  '.hh': CPP,\n  '.hxx': CPP,\n  '.h': CPP,\n\n  // PHP / Laravel Blade\n  '.php': PHP,\n  '.phtml': PHP,\n  '.php3': PHP,\n  '.php4': PHP,\n  '.php5': PHP,\n  '.phar': PHP,\n  '.inc': PHP,\n  '.blade.php': undefined,\n\n  // Swift\n  '.swift': Swift,\n\n  // Kotlin\n  '.kt': Kotlin,\n  '.kts': Kotlin,\n\n  // Go\n  '.go': Go,\n\n  // Rust\n  '.rs': Rust,\n\n  // Ruby\n  '.rb': Ruby,\n\n  // Scala\n  '.scala': Scala,\n  '.sc': Scala,\n\n  // Dart\n  //'.dart': Dart,\n\n  // Shell scripts\n  //'.sh': Shell,\n  //'.bash': Shell,\n  //'.zsh': Shell,\n\n  // Perl\n  //'.pl': Perl,\n  //'.pm': Perl,\n  //'.t': Perl,\n\n  // Lua\n //'.lua': Lua,\n\n  // MATLAB\n   //'.m': Matlab,\n\n  // Fortran\n   //'.f': Fortran,\n   //'.for': Fortran,\n   //'.f90': Fortran,\n};\n\nconst STRING_NODE_TYPES = new Set([\n  // Generic string literals\n 'string_literal', 'string', 'template_string',\n\n // Go\n 'interpreted_string_literal', 'raw_string_literal',\n\n // PHP\n 'encapsed_string', 'string_content',\n\n // JSX\n 'jsx_text',\n\n // C#\n 'interpolated_string_expression',\n 'interpolated_regular_string_literal',\n 'interpolated_verbatim_string_literal',\n\n // Swift\n 'string_literal',      // Swift grammar uses same node type\n\n // Perl\n 'string',              // Perl grammar calls them “string”\n\n //Swift\n 'line_string_literal', 'line_str_text',\n\n // Others (Rust, Kotlin, Java, etc.)\n 'string_literal',\n]);\n\nexport function extractStringsFromFile(\n  filePath: string,\n  includeSnippet = false\n): StringMetadata[] {\n  const ext = path.extname(filePath).toLowerCase();\n  let Grammar = LANG_MAP[ext];\n\n  //Blade is \"plain text\"\n  if(filePath.endsWith(\".blade.php\"))\n    Grammar = undefined;\n\n  const content = fs.readFileSync(filePath, 'utf-8');\n  const results: StringMetadata[] = [];\n\n  if (Grammar) {\n    const parser = new Parser();\n    parser.setLanguage(Grammar);\n    const tree = parser.parse(content);\n\n    function walk(node: Parser.SyntaxNode) {\n      if (STRING_NODE_TYPES.has(node.type) && !(node.parent && STRING_NODE_TYPES.has(node.parent.type))) {\n        \n        const start = node.startPosition;\n        const raw = content.slice(node.startIndex, node.endIndex);\n        const value = raw.replace(/^(['\"`])|(\\1)$/g, '');\n\n        const metadata: StringMetadata = {\n          value,\n          filePath,\n          line: start.row + 1,\n          column: start.column,\n        };\n\n        const varName = getVariableName(node);\n        if (varName) \n          metadata.variableName = varName;\n\n        if (includeSnippet) {\n          const snippetData = getSnippet(content, metadata.line, metadata.column);\n          Object.assign(metadata, snippetData);\n        }\n        results.push(metadata);\n      }\n      node.children.forEach(walk);\n    }\n    walk(tree.rootNode);\n  } else {\n    // Fallback: regex for quoted strings (double, single, backticks)\n    const regex = /(['\"`])((?:\\\\.|(?!\\1).)*?)\\1/g;\n    for (const [idx, line] of content.split('\\n').entries()) {\n      let match;\n      while ((match = regex.exec(line))) {\n        const [, , val] = match;\n        const metadata: StringMetadata = {\n          value: val,\n          filePath,\n          line: idx + 1,\n          column: match.index,\n        };\n        if (includeSnippet) {\n          const snippetData = getSnippet(content, metadata.line, metadata.column);\n          Object.assign(metadata, snippetData);\n        }\n        results.push(metadata);\n      }\n    }\n  }\n\n  return results;\n}\n\nfunction getVariableName(node: Parser.SyntaxNode): string | undefined {\n  let curr: Parser.SyntaxNode | null = node;\n\n  while (curr) {\n    const parent:any = curr.parent;\n    if (!parent) break;\n\n    // C#/JS/TS/Java/Go: var foo = \"bar\"; or foo = \"bar\";\n    if (parent.type === 'variable_declarator' || parent.type === 'assignment_expression' || parent.type === 'assignment') {\n      const id = parent.child(0);\n      if (id?.type === 'identifier') return id.text;\n    }\n\n    // Python: assignment\n    if (parent.type === 'assignment') {\n      const id = parent.child(0);\n      if (id?.type === 'identifier') return id.text;\n    }\n\n    // Object literal\n    if (parent.type === 'pair') {\n      const key = parent.child(0);\n      if (key?.type === 'identifier') return key.text;\n      if (key?.type === 'string') return key.text.replace(/^['\"`]|['\"`]$/g, '');\n    }\n\n    // Function parameter\n    if (parent.type === 'parameter' || parent.type === 'parameter_definition') {\n      const id = parent.child(0);\n      if (id?.type === 'identifier') return id.text;\n    }\n\n    curr = parent;\n  }\n\n  return undefined;\n}\n\nexport function extractStringsFromFiles(\n  files: string[],\n  includeSnippet = false\n): StringMetadata[] {\n  return files.flatMap(fp => extractStringsFromFile(path.resolve(fp), includeSnippet));\n}","// src/core/extractors/stringExtractor.ts\n\nimport fs from 'fs';\nimport path from 'path';\nimport { parse } from '@babel/parser';\nimport type { NodePath } from \"@babel/traverse\";\nimport traverse from \"@babel/traverse\";\nimport * as t from '@babel/types';\n\nexport interface StringMetadata {\n    value: string;\n    filePath: string;\n    line: number;\n    column: number;\n    snippet?: string;\n    highlight?: number;\n    snippetLineNumber?: number;\n    variableName?: string;\n  }\n\ninterface SnippetOptions {\n  linesBefore?: number;  // Cuántas líneas antes\n  linesAfter?: number;   // Cuántas líneas después\n}\n\n// src/core/extractors/stringExtractor.ts\n\ninterface SnippetResult {\n    snippet: string;\n    highlight: number;       // Índice de caracteres en el snippet\n    snippetLineNumber: number; // Línea relativa dentro del snippet\n  }\n  \n  export function getSnippet(\n    content: string,\n    line: number,\n    column: number,\n    options: SnippetOptions = { linesBefore: 3, linesAfter: 3 }\n  ): SnippetResult {\n    const lines = content.split('\\n');\n  \n    // El archivo usa líneas basadas en 1, ajustamos el rango\n    const startLine = Math.max(line - (options.linesBefore ?? 3), 1);\n    const endLine = Math.min(line + (options.linesAfter ?? 3), lines.length);\n  \n    // Obtenemos las líneas del snippet\n    const snippetLines = lines.slice(startLine - 1, endLine);\n    const snippet = snippetLines.join('\\n');\n  \n    let highlight = 0;\n    let snippetLineNumber = line - startLine + 1; \n    // Por ejemplo, si line=17 y startLine=14 => snippetLineNumber=4 (línea 4 en el snippet)\n  \n    // Calculamos la posición de highlight en caracteres (opcional)\n    if (line >= startLine && line <= endLine) {\n      const currentLineIndex = snippetLineNumber - 1; // 0-based\n      // Suma la longitud de las líneas anteriores + 1 por cada salto de línea\n      highlight = snippetLines\n        .slice(0, currentLineIndex)\n        .reduce((acc, ln) => acc + ln.length + 1, 0);\n  \n      highlight += column;\n    }\n  \n    return { snippet, highlight, snippetLineNumber };\n  }\n  \n\n/**\n * Extrae el nombre de la variable si la cadena está en la parte de inicialización\n * de un VariableDeclarator o en un AssignmentExpression, etc.\n */\nfunction getVariableName(path: NodePath<t.StringLiteral>): string | undefined {\n  const parent = path.parentPath;\n  \n  // Caso 1: let apikey = \"1234\";\n  if (parent.isVariableDeclarator()) {\n    const decl = parent.node;\n    // decl.id podría ser un Identifier o un Pattern\n    if (t.isIdentifier(decl.id)) {\n      return decl.id.name;\n    }\n  }\n\n  // Caso 2: apikey = \"1234\";\n  // Asignación (x = \"1234\"), en el AST: AssignmentExpression { operator: '=', left, right }\n  if (parent.isAssignmentExpression()) {\n    const assign = parent.node;\n    if (t.isIdentifier(assign.left)) {\n      return assign.left.name;\n    }\n  }\n\n  // Caso 3: objeto = { token: \"xxx\" };\n  // Podrías chequear si es ObjectProperty\n  if (parent.isObjectProperty()) {\n    const prop = parent.node;\n    // Si la key es un Identifier, podemos usar prop.key.name\n    // Si la key es un StringLiteral, podemos usar prop.key.value\n    if (t.isIdentifier(prop.key)) {\n      return prop.key.name; \n    } else if (t.isStringLiteral(prop.key)) {\n      return prop.key.value;\n    }\n  }\n\n  // Otros casos: parámetros de función, arrays, etc. \n  // Podrías ampliar más lógica si lo deseas.\n  return undefined;\n}\n\nexport function extractStringsFromFile(filePath: string, includeSnippet = false): StringMetadata[] {\n  const content = fs.readFileSync(filePath, 'utf-8');\n  let ast: t.File;\n\n  try {\n    ast = parse(content, {\n      sourceType: 'module',\n      plugins: [\n        'typescript',\n        'jsx',\n        'classProperties',\n        ['decorators', { decoratorsBeforeExport: true }],\n      ],\n      errorRecovery: true\n    }) as t.File;\n  } catch (error) {\n    console.warn(`Could not parse ${filePath}: ${error}`);\n    return [];\n  }\n\n  const results: StringMetadata[] = [];\n\n  traverse(ast, {\n    StringLiteral(path: NodePath<t.StringLiteral>) {\n        const { line, column } = path.node.loc?.start ?? { line: 0, column: 0 };\n        const metadata: StringMetadata = {\n          value: path.node.value,\n          filePath,\n          line,\n          column\n    };\n\n      // Intentamos extraer el nombre de la variable\n      const varName = getVariableName(path);\n      if (varName) {\n        metadata.variableName = varName;\n      }\n\n      if (includeSnippet && line > 0) {\n        const snippetData = getSnippet(content, line, column);\n        metadata.snippet = snippetData.snippet;\n        metadata.highlight = snippetData.highlight;\n        metadata.snippetLineNumber = snippetData.snippetLineNumber; \n      }\n\n      results.push(metadata);\n    }\n  });\n\n  return results;\n}\n\nexport function extractStringsFromFiles(files: string[], includeSnippet = false): StringMetadata[] {\n  const allStrings: StringMetadata[] = [];\n  for (const filePath of files) {\n    const absolutePath = path.resolve(filePath);\n    const stringsInFile = extractStringsFromFile(absolutePath, includeSnippet);\n    allStrings.push(...stringsInFile);\n  }\n  return allStrings;\n}\n","// src/core/patternLoader.ts\nimport fs from 'fs';\nimport yaml from 'js-yaml';\n\nexport interface PatternDefinition {\n  name: string;\n  regex: string;\n  confidence: string; // \"high\", \"low\", etc.\n}\n\ninterface YamlPatternItem {\n  pattern: {\n    name: string;\n    regex: string;\n    confidence: string;\n  };\n}\n\nexport function loadPatterns(filePath: string): PatternDefinition[] {\n  if (!fs.existsSync(filePath)) {\n    throw new Error(`Can't read patterns data. File not found: ${filePath}`);\n  }\n\n  const content = fs.readFileSync(filePath, 'utf-8');\n  const data = yaml.load(content) as { patterns: YamlPatternItem[] };\n\n  if (!data || !data.patterns) {\n    throw new Error(`Invalid YAML structure. Missing 'patterns' key in ${filePath}`);\n  }\n\n  // Convertimos cada item en un PatternDefinition\n  const patterns: PatternDefinition[] = [];\n  for (const item of data.patterns) {\n    if (!item.pattern) continue;\n    patterns.push({\n      name: item.pattern.name,\n      regex: item.pattern.regex,\n      confidence: item.pattern.confidence\n    });\n  }\n\n  return patterns;\n}\n","// src/core/helpers/secretKeyGenerator.ts\n\nimport crypto from 'crypto';\nimport path from 'path';\n\n// Diccionario que mapea patrones regex a descripciones\nconst patternToDescription: Record<string, string> = {\n  'api_?key': 'api_key',\n  'auth_?key': 'auth_key',\n  'service_?key': 'service_key',\n  'account_?key': 'account_key',\n  'db_?key': 'database_key',\n  'database_?key': 'database_key',\n  'priv_?key': 'private_key',\n  'private_?key': 'private_key',\n  'client_?key': 'client_key',\n  'db_?pass': 'database_password',\n  'database_?pass': 'database_password',\n  'key_?pass': 'key_password',\n  'password': 'password',\n  'passwd': 'password',\n  'pwd': 'password',\n  'secret': 'secret',\n  'contraseña': 'password_spanish',\n  'contrasena': 'password_spanish',\n  '.*api[-_]?key.*': 'api_key',\n  '.*auth[-_]?key.*': 'auth_key',\n  '.*service[-_]?key.*': 'service_key',\n  '.*account[-_]?key.*': 'account_key',\n  '.*db[-_]?key.*': 'database_key',\n  '.*database[-_]?key.*': 'database_key',\n  '.*priv[-_]?key.*': 'private_key',\n  '.*private[-_]?key.*': 'private_key',\n  '.*client[-_]?key.*': 'client_key',\n  '.*db[-_]?pass.*': 'database_password',\n  '.*database[-_]?pass.*': 'database_password',\n  '.*key[-_]?pass.*': 'key_password',\n  '.*password.*': 'password',\n  '.*passwd.*': 'password',\n  '.*pwd.*': 'password',\n  '.*secret.*': 'secret',\n  '.*contraseña.*': 'password',\n  '.*contrasena.*': 'password',\n  '.*token.*': 'token',\n  '.*session[-_]?id.*': 'session_id',\n  '.*access[-_]?token.*': 'access_token',\n  '.*refresh[-_]?token.*': 'refresh_token',\n  '.*credential.*': 'credential',\n  '.*signature.*': 'signature',\n  '.*encrypt.*': 'encryption_key',\n  '.*decrypt.*': 'decryption_key',\n  '.*certificate.*': 'certificate',\n  '.*login.*': 'login',\n  '.*user[-_]?name.*': 'username',\n  '.*username.*': 'username',\n  '.*user[-_]?id.*': 'user_id',\n  '.*userid.*': 'userid'\n};\n\nexport class SecretKeyGenerator {\n  // Propiedades equivalentes a _prefix, _appName, _appVersion\n  public static prefix: string = 'auto_';\n  public static appName: string = '';\n  public static appVersion: string = '';\n\n  /**\n   * Genera un \"key name\" descriptivo basándose en variableName,\n   * usando patternToDescription para encontrar un tipo.\n   */\n  private static generateKeyName(variableName: string): string {\n    const descriptivePart2 = this.extractDescriptivePart(variableName);\n\n    // Recorremos cada patrón y verificamos si hace match\n    for (const [regexStr, desc] of Object.entries(patternToDescription)) {\n      const regex = new RegExp(regexStr, 'i');\n      if (regex.test(variableName)) {\n        // Extraemos parte descriptiva si la hay\n        const descriptivePart = this.extractDescriptivePartWithPattern(variableName, regexStr);\n        const finalDescPart = descriptivePart.length > 0 ? descriptivePart : descriptivePart2;\n        return finalDescPart.length > 0 ? `${finalDescPart}-${desc}` : desc;\n      }\n    }\n\n    // Si no coincide con ningún patrón\n    return descriptivePart2.length > 0 ? descriptivePart2 : 'sensitive-data';\n  }\n\n  /**\n   * Extrae la parte descriptiva anterior al patrón detectado.\n   */\n  private static extractDescriptivePartWithPattern(variableName: string, pattern: string): string {\n    const regex = new RegExp(pattern, 'i');\n    const parts = variableName.split(regex);\n    if (parts.length > 1) {\n      return parts[0].replace(/_/g, '');\n    }\n    return '';\n  }\n\n  /**\n   * Extrae la parte descriptiva de variableName separando por _ o espacios,\n   * omitiendo la primera parte que suele ser la keyword (ej: \"db_pass\" -> \"pass\").\n   */\n  private static extractDescriptivePart(variableName: string): string {\n    const parts = variableName.split(/[_\\s]/);\n    if (parts.length > 1) {\n      // unimos las partes excepto la primera\n      return parts.slice(1).join('_');\n    }\n    return '';\n  }\n\n  /**\n   * Extrae la \"pista de localización\" a partir del nombre de archivo\n   * sin extensión (equivalente a Path.GetFileNameWithoutExtension).\n   */\n  private static extractLocationHint(filePathStr: string): string {\n    if (!filePathStr) return '';\n    const base = path.basename(filePathStr, path.extname(filePathStr));\n    return base.toLowerCase();\n  }\n\n  /**\n   * Genera un ID único usando SHA256 sobre hash, fullMethod, _appName, _appVersion.\n   */\n  public static generateID(hash: string, fullMethod: string): string {\n    const inputData = `${hash}_${fullMethod}_${this.appName}_${this.appVersion}`;\n    const sha256Hash = crypto.createHash('sha256').update(inputData, 'utf8').digest('hex');\n    return sha256Hash; // En .NET devuelves el string entero (64 hex chars)\n  }\n\n  /**\n   * Genera la key final combinando:\n   * - prefix\n   * - detectionMethod (keyword/entropy/..)\n   * - detectionName\n   * - variableName => se usa generateKeyName\n   * - locationHint\n   * - un hash corto de secretValue\n   */\n  public static generateKey(\n    detectionMethod: string,\n    detectionName: string,\n    filePath: string,\n    //methodName: string,\n    variableName: string,\n    secretValue: string\n  ): string {\n    let keyBuilder = this.sanitizeKeyPart(this.prefix);\n\n    switch (detectionMethod.toLowerCase()) {\n      case 'keyword':\n        if (variableName) {\n          keyBuilder += this.sanitizeKeyPart(this.generateKeyName(variableName));\n        } else if (detectionName) {\n          keyBuilder += this.sanitizeKeyPart(detectionName);\n        }\n        break;\n\n      case 'entropy':\n        keyBuilder += 'sensitive-data';\n        break;\n\n      default:\n        keyBuilder += this.sanitizeKeyPart(detectionName);\n        break;\n    }\n\n    const locationHint = this.sanitizeKeyPart(this.extractLocationHint(filePath));\n    if (locationHint) {\n      keyBuilder += `-${locationHint}`;\n    }\n\n    // Añadimos un hash corto para evitar colisiones\n    keyBuilder += `-${this.sanitizeKeyPart(this.generateHash(secretValue))}`;\n\n    // Limpiamos guiones duplicados y limitamos longitud\n    let result = keyBuilder.replace(/-+/g, '-').replace(/^-|-$/g, '');\n    if (result.length > 200) {\n      result = result.substring(0, 200);\n    }\n\n    return result;\n  }\n\n  /**\n   * Limpia la cadena de caracteres no alfanuméricos,\n   * reemplazándolos por guiones y pasando a minúsculas.\n   */\n  public static sanitizeKeyPart(input: string): string {\n    if (!input) return input;\n    let sanitized = input.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();\n    // Sustituimos múltiples guiones por uno solo\n    sanitized = sanitized.replace(/-+/g, '-');\n    return sanitized;\n  }\n\n  /**\n   * Genera un hash SHA256 del input y se queda con los primeros 6 caracteres,\n   * similar al GenerateHash() en .NET\n   */\n  private static generateHash(input: string): string {\n    const hash = crypto.createHash('sha256').update(input, 'utf8').digest('hex');\n    // Tomamos solo 6 chars para hacerlo corto\n    return hash.substring(0, 6);\n  }\n}\n","// src/core/detectors/patternScanner.ts\nimport { PatternDefinition } from '../patternLoader.js';\nimport { StringMetadata } from '../extractors/stringExtractor.js';\nimport { SecretKeyGenerator } from '../helpers/secretKeyGenerator.js';\nimport { SecretMetadata } from '../mainScanner.js';\n\nexport function scanWithPatterns(\n    strings: StringMetadata[],\n    patterns: PatternDefinition[]\n  ): SecretMetadata[] {\n    const results: SecretMetadata[] = [];\n  \n    // Filtramos solo los patrones con confidence == \"high\"\n    const highConfidence = patterns.filter(p => p.confidence === 'high');\n  \n    // Recorremos cada patrón\n    for (const pat of highConfidence) {\n      const regex = new RegExp(pat.regex, 'i');\n  \n      // Comprobamos cada cadena\n      for (const str of strings) {\n        if (regex.test(str.value)) {\n          // Llamamos a SecretKeyGenerator para generar la key\n          const key = SecretKeyGenerator.generateKey(\n            'pattern',        // detectionMethod\n            pat.name,         // detectionName\n            str.filePath,     // filePath\n            str.variableName ?? '', // variableName (si existe)\n            str.value         // secretValue\n          );\n  \n          // Evitamos duplicados\n          if (!results.some(r => r.value === str.value && r.filePath === str.filePath && r.line === str.line)) {\n            results.push({\n              value: str.value,\n              key,\n              name: pat.name,\n              confidence: pat.confidence,\n              discoveredBy: 'pattern',\n              filePath: str.filePath,\n              line: str.line,\n              snippet: str.snippet,\n              highlight: str.highlight,\n              snippetLineNumber: str.snippetLineNumber,\n              variableName: str.variableName\n            });\n          }\n        }\n      }\n    }\n  \n    return results;\n  }\n","// src/core/detectors/plugins/RegexBasedDetector.ts\n\nimport { ISecretDetector } from './ISecretDetector.js';\n\n/**\n * Clase base para detectores que usan una sola expresión regular principal\n * para determinar si un string contiene un secreto.\n */\nexport abstract class RegexBasedDetector implements ISecretDetector {\n  /**\n   * Nombre o tipo de secreto (p.ej. \"Stripe Access Key\").\n   * Cada subclase debe definirlo.\n   */\n  abstract secretType: string;\n\n  /**\n   * Expresión regular principal para detectar el secreto.\n   */\n  abstract tokenRegex: RegExp;\n\n  /**\n   * Implementa la lógica de containsSecret usando la tokenRegex.\n   */\n  containsSecret(input: string): boolean {\n    return this.tokenRegex.test(input);\n  }\n}\n","// src/core/detectors/plugins/database/MongoDbDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MongoDbDetector extends RegexBasedDetector {\n  public secretType = 'MongoDB Connection String';\n\n  public tokenRegex = new RegExp(\n    [\n      // MongoDB SRV URI (Atlas/cloud)\n      'mongodb\\\\+srv:\\\\/\\\\/[a-zA-Z0-9._%+-]+:[^@\\\\s]+@[^\\\\/\\\\s]+\\\\.[^\\\\/\\\\s]+\\\\/[a-zA-Z0-9_-]+',\n      // MongoDB URI (self-hosted or local)\n      'mongodb:\\\\/\\\\/[a-zA-Z0-9._%+-]+:[^@\\\\s]+@[^\\\\/\\\\s]+(:\\\\d+)?\\\\/[a-zA-Z0-9_-]+',\n      // In env or config\n      'MONGODB_URI\\\\s*[:=]\\\\s*[\\'\"]?mongodb[^\\'\"\\\\s]+[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/PostgreSQLDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PostgreSQLDetector extends RegexBasedDetector {\n  public secretType = 'PostgreSQL Connection String';\n\n  public tokenRegex = new RegExp(\n    [\n      // PostgreSQL URI\n      'postgres:\\\\/\\\\/[a-zA-Z0-9._%+-]+:[^@\\\\s]+@[^\\\\/\\\\s]+(:\\\\d+)?\\\\/[a-zA-Z0-9_-]+',\n      // Environment variable style\n      'POSTGRES_(URL|URI|PASSWORD)\\\\s*[:=]\\\\s*[\\'\"]?.+[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/MySQLDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MySQLDetector extends RegexBasedDetector {\n  public secretType = 'MySQL Connection String';\n\n  public tokenRegex = new RegExp(\n    [\n      // MySQL URI\n      'mysql:\\\\/\\\\/[a-zA-Z0-9._%+-]+:[^@\\\\s]+@[^\\\\/\\\\s]+(:\\\\d+)?\\\\/[a-zA-Z0-9_-]+',\n      // Env variable style\n      'MYSQL_(URL|URI|PASSWORD)\\\\s*[:=]\\\\s*[\\'\"]?.+[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/RedisDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class RedisDetector extends RegexBasedDetector {\n  public secretType = 'Redis Connection String';\n\n  public tokenRegex = new RegExp(\n    [\n      // Redis URI with password\n      'redis:\\\\/\\\\:[^@\\\\s]+@[^\\\\/\\\\s]+(:\\\\d+)?',\n      // Environment variable style\n      'REDIS_URL\\\\s*[:=]\\\\s*[\\'\"]?redis:\\\\/\\\\/[^\\'\"\\\\s]+[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/ElasticsearchDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ElasticsearchDetector extends RegexBasedDetector {\n  public secretType = 'Elasticsearch Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      // Elasticsearch URL with basic auth\n      'https?:\\\\/\\\\/[a-zA-Z0-9._%+-]+:[^@\\\\s]+@[^\\\\/\\\\s]+(:\\\\d+)?\\\\/?',\n      // Environment variable style\n      'ELASTICSEARCH_(URL|PASSWORD)\\\\s*[:=]\\\\s*[\\'\"]?.+[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/plugins/database/FirebaseDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class FirebaseDetector extends RegexBasedDetector {\n  public secretType = 'Firebase API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      // Firebase API Key (General format)\n      'AIza[0-9A-Za-z-_]{35}',\n\n      // Firebase Admin SDK Service Account\n      'FIREBASE_AUTH\\\\s*[:=]\\\\s*[\\'\"]?AIza[0-9A-Za-z-_]{35}[\\'\"]?',\n\n      // Firebase Realtime Database URL (with API keys)\n      '[a-zA-Z0-9_-]+\\\\.firebaseio\\\\.com/.+/.+/.+/.+',\n\n      // Firebase credentials\n      'GOOGLE_APPLICATION_CREDENTIALS\\\\s*[:=]\\\\s*[\\'\"]?firebase-adminsdk-[a-z0-9]{16}\\\\@[a-z0-9]+\\\\.iam\\\\.gserviceaccount\\\\.com[\\'\"]?',\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/SupabaseDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SupabaseDetector extends RegexBasedDetector {\n  public secretType = 'Supabase Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      // Supabase URL\n      'SUPABASE_URL\\\\s*[:=]\\\\s*[\\'\"]?https:\\\\/\\\\/[a-z0-9]{20,40}\\\\.supabase\\\\.co[\\'\"]?',\n      // Supabase anon key\n      'SUPABASE_ANON_KEY\\\\s*[:=]\\\\s*[\\'\"]?[a-zA-Z0-9-_]{40,100}[\\'\"]?',\n      // Supabase service role key\n      'SUPABASE_SERVICE_ROLE_KEY\\\\s*[:=]\\\\s*[\\'\"]?[a-zA-Z0-9-_]{40,100}[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/database/GoogleCloudStorageDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class GoogleCloudStorageDetector extends RegexBasedDetector {\n  public secretType = 'Google Cloud Storage Key';\n\n  public tokenRegex = new RegExp(\n    [\n      // Service account JSON key fields\n      '\"type\"\\\\s*:\\\\s*\"service_account\"',\n      '\"project_id\"\\\\s*:\\\\s*\"[a-z0-9-]+\"',\n      '\"private_key_id\"\\\\s*:\\\\s*\"[a-f0-9]+\"',\n      '\"private_key\"\\\\s*:\\\\s*\"-----BEGIN PRIVATE KEY-----[^\"]+-----END PRIVATE KEY-----\"',\n      // Environment variable style\n      'GOOGLE_APPLICATION_CREDENTIALS\\\\s*[:=]\\\\s*[\\'\"]?.+\\\\.json[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/plugins/database/CloudantDetector.ts\n\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CloudantDetector extends RegexBasedDetector {\n  public secretType = 'Cloudant Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      // Cloudant URL with API Key (basic format)\n      'https?:\\\\/\\\\/[a-zA-Z0-9]+:[a-zA-Z0-9_-]+@[^\\\\/]+\\\\.cloudant\\\\.com',\n\n      // Cloudant credentials with API Key (no base URL)\n      'cloudant\\\\.(key|password|token)\\\\s*[:=]\\\\s*[\\'\"]?[a-zA-Z0-9_-]{32}[\\'\"]?',\n\n      // Cloudant credentials for service accounts\n      'CLOUDANT_API_KEY\\\\s*[:=]\\\\s*[\\'\"]?[a-zA-Z0-9_-]{32}[\\'\"]?',\n\n      // Cloudant URL with basic auth and no user/password\n      'https?:\\\\/\\\\/[a-zA-Z0-9]+@[^\\\\/]+\\\\.cloudant\\\\.com',\n    ].join('|'),\n    'gi'\n  );\n}","// SendGridDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SendGridDetector extends RegexBasedDetector {\n  public secretType = 'SendGrid API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"SG\\.[a-zA-Z0-9_-]{22}\\.[a-zA-Z0-9_-]{43}\",\n      \"SENDGRID_API_KEY\\s*[:=]\\s*[\\\"']?SG\\.[a-zA-Z0-9_-]{22}\\.[a-zA-Z0-9_-]{43}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// SlackDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SlackDetector extends RegexBasedDetector {\n  public secretType = 'Slack Token or Webhook';\n\n  public tokenRegex = new RegExp(\n    [\n      \"xox(?:a|b|p|o|s|r)-(?:\\d+-)+[a-z0-9]+\",\n      \"https://hooks\\.slack\\.com/services/T[a-zA-Z0-9_]+/B[a-zA-Z0-9_]+/[a-zA-Z0-9_]+\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// WhatsAppCloudDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class WhatsAppCloudDetector extends RegexBasedDetector {\n  public secretType = 'WhatsApp Cloud API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"EAACEdEose0cBA[0-9A-Za-z]{32,}\",\n      \"WHATSAPP_TOKEN\\s*[:=]\\s*[\\\"']?EAACEdEose0cBA[0-9A-Za-z]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// VonageDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class VonageDetector extends RegexBasedDetector {\n  public secretType = 'Vonage (Nexmo) API Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"VONAGE_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{8}[\\\"']?\",\n      \"VONAGE_API_SECRET\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{16,}[\\\"']?\",\n      \"NEXMO_(API_KEY|API_SECRET)\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{8,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PlivoDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PlivoDetector extends RegexBasedDetector {\n  public secretType = 'Plivo API Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"PLIVO_AUTH_ID\\s*[:=]\\s*[\\\"']?[A-Z0-9]{20}[\\\"']?\",\n      \"PLIVO_AUTH_TOKEN\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// MailchimpDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MailchimpDetector extends RegexBasedDetector {\n  public secretType = 'Mailchimp Access Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"[0-9a-z]{32}-us[0-9]{1,2}\",\n      \"MAILCHIMP_API_KEY\\s*[:=]\\s*[\\\"']?[0-9a-z]{32}-us[0-9]{1,2}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PostmarkDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PostmarkDetector extends RegexBasedDetector {\n  public secretType = 'Postmark Server Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"POSTMARK_API_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{36}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// ZoomApiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ZoomApiDetector extends RegexBasedDetector {\n  public secretType = 'Zoom JWT or SDK Secret';\n\n  public tokenRegex = new RegExp(\n    [\n      \"zoom_jwt_token\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{20,}[\\\"']?\",\n      \"ZOOM_(JWT|SDK)_SECRET\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// SmtpGenericDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SmtpGenericDetector extends RegexBasedDetector {\n  public secretType = 'Generic SMTP Password';\n\n  public tokenRegex = new RegExp(\n    [\n      \"(SMTP|EMAIL|MAIL)(_|)?(PASS|PASSWORD|AUTH)\\s*[:=]\\s*[\\\"']?.{8,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// DiscordBotTokenDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class DiscordBotTokenDetector extends RegexBasedDetector {\n  public secretType = 'Discord Bot Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"[MNOPQ][a-zA-Z\\d_-]{23,25}\\.[a-zA-Z\\d_-]{6}\\.[a-zA-Z\\d_-]{27}\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// MailgunDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MailgunDetector extends RegexBasedDetector {\n  public secretType = 'Mailgun API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"key-[a-f0-9]{32}\",\n      \"MAILGUN_API_KEY\\s*[:=]\\s*[\\\"']?key-[a-f0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// FirebaseAuthDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class FirebaseAuthDetector extends RegexBasedDetector {\n  public secretType = 'Firebase Auth Keys';\n\n  public tokenRegex = new RegExp(\n    [\n      \"FIREBASE_API_KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9-_]{39,}[\\\"']?\",\n      \"FIREBASE_AUTH_DOMAIN\\s*[:=]\\s*[\\\"']?[a-z0-9-]+\\.firebaseapp\\.com[\\\"']?\",\n      \"FIREBASE_PROJECT_ID\\s*[:=]\\s*[\\\"']?[a-z0-9-]{6,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// OktaDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class OktaDetector extends RegexBasedDetector {\n  public secretType = 'Okta API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"OKTA_CLIENT_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n      \"OKTA_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n      \"https://[a-zA-Z0-9_-]+\\.okta\\.com\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// ClerkDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ClerkDetector extends RegexBasedDetector {\n  public secretType = 'Clerk.dev API Keys';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CLERK_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{40,}[\\\"']?\",\n      \"CLERK_SECRET_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// SuperTokensDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SuperTokensDetector extends RegexBasedDetector {\n  public secretType = 'SuperTokens API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"SUPERTOKENS_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// Auth0Detector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class Auth0Detector extends RegexBasedDetector {\n  public secretType = 'Auth0 Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AUTH0_DOMAIN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]+\\.auth0\\.com[\\\"']?\",\n      \"AUTH0_CLIENT_SECRET\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{32,}[\\\"']?\",\n      \"AUTH0_API_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// src/core/detectors/plugins/NpmTokenDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class NpmTokenDetector extends RegexBasedDetector {\n  public secretType = 'NPM Token';\n\n  /**\n   * Detects NPM tokens in `.npmrc` or env-like strings.\n   * Example:\n   *   //registry.npmjs.org/:_authToken=npm_abcd1234...\n   *   //my-registry/:_authToken=31dd103e-017c-4f0a-bd9d-9fa970bd24a4\n   */\n  public tokenRegex = new RegExp(\n    String.raw`\\/\\/.+\\/:_authToken=\\s*((npm_[a-zA-Z0-9]+)|([A-Fa-f0-9-]{36}))`,\n    'gi'\n  );\n\n  // Opcional: podrías agregar isFormallyValid o verifySecret si decides extenderlo.\n}","// JenkinsDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class JenkinsDetector extends RegexBasedDetector {\n  public secretType = 'Jenkins Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"JENKINS_(USER|API_TOKEN|AUTH)\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9@:_\\-]{8,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// GitHubActionsDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class GitHubActionsDetector extends RegexBasedDetector {\n  public secretType = 'GitHub Actions Secrets';\n\n  public tokenRegex = new RegExp(\n    [\n      \"GITHUB_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_]{20,}[\\\"']?\",\n      \"ACTIONS_RUNTIME_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_\\-]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// TerraformCloudDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class TerraformCloudDetector extends RegexBasedDetector {\n  public secretType = 'Terraform Cloud Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"tfp_[a-zA-Z0-9]{30,}\",\n      \"TERRAFORM_TOKEN\\s*[:=]\\s*[\\\"']?tfp_[a-zA-Z0-9]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// DroneCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class DroneCiDetector extends RegexBasedDetector {\n  public secretType = 'Drone CI Secrets';\n\n  public tokenRegex = new RegExp(\n    [\n      \"DRONE_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n      \"DRONE_SECRET\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PulumiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PulumiDetector extends RegexBasedDetector {\n  public secretType = 'Pulumi Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"pul-[a-f0-9]{32}\",\n      \"PULUMI_ACCESS_TOKEN\\s*[:=]\\s*[\\\"']?pul-[a-f0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// BuddyCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class BuddyCiDetector extends RegexBasedDetector {\n  public secretType = 'Buddy API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"BUDDY_API_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// GitLabCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class GitLabCiDetector extends RegexBasedDetector {\n  public secretType = 'GitLab CI/CD Tokens';\n\n  public tokenRegex = new RegExp(\n    [\n      \"glpat-[A-Za-z0-9_\\-]{20,50}\",\n      \"CI_JOB_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{20,}[\\\"']?\",\n      \"GL_SECRET\\s*[:=]\\s*[\\\"']?.{16,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CodefreshDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CodefreshDetector extends RegexBasedDetector {\n  public secretType = 'Codefresh API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CODEFRESH_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// TravisCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class TravisCiDetector extends RegexBasedDetector {\n  public secretType = 'Travis CI Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"TRAVIS_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CircleCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CircleCiDetector extends RegexBasedDetector {\n  public secretType = 'CircleCI Tokens';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CIRCLE_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n      \"CIRCLECI_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// BitbucketCiDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class BitbucketCiDetector extends RegexBasedDetector {\n  public secretType = 'Bitbucket Pipelines Tokens';\n\n  public tokenRegex = new RegExp(\n    [\n      \"bbp-[a-f0-9]{40,}\",\n      \"BITBUCKET_SECRET\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// src/core/detectors/plugins/TwilioKeyDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class TwilioKeyDetector extends RegexBasedDetector {\n  public secretType = 'Twilio API Key';\n\n  /**\n   * Detects:\n   * - Account SID: ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n   * - Secret Key: SKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n   * - Optional: AK/RK keys used by SDKs\n   * - Contextual: TWILIO_AUTH_TOKEN=...\n   */\n  public tokenRegex = new RegExp(\n    [\n      // Account SID\n      'AC[a-z0-9]{32}',\n\n      // Secret Key\n      'SK[a-z0-9]{32}',\n\n      // Optional SDK keys\n      'AK[a-z0-9]{32}',\n      'RK[a-z0-9]{32}',\n\n      // In context (env var style)\n      'TWILIO_(AUTH|API)?_?TOKEN\\\\s*[:=]\\\\s*[\\'\"]?[a-z0-9]{32}[\\'\"]?'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/JwtTokenDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class JwtTokenDetector extends RegexBasedDetector {\n  public secretType = 'JSON Web Token';\n\n  /**\n   * Regex para detectar tokens JWT (header.payload.signature), incluyendo firmados o incompletos.\n   */\n  public tokenRegex = new RegExp(\n    'eyJ[A-Za-z0-9-_=]+\\\\.[A-Za-z0-9-_=]+\\\\.?[A-Za-z0-9-_.+/=]*?',\n    'gi'\n  );\n\n  /**\n   * Verifica si el token tiene una estructura válida y decodificable (header y payload con JSON).\n   */\n  public async isFormallyValid(token: string): Promise<boolean> {\n    const parts = token.split('.');\n    if (parts.length < 2) return false;\n\n    for (let i = 0; i < 2; i++) {\n      const part = parts[i];\n      try {\n        const padded = this.addPadding(part);\n        const decoded = Buffer.from(padded, 'base64').toString('utf-8');\n        JSON.parse(decoded); // Throw if not valid JSON\n      } catch {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private addPadding(input: string): string {\n    const mod = input.length % 4;\n    if (mod === 2) return input + '==';\n    if (mod === 3) return input + '=';\n    if (mod === 1) throw new Error('Invalid JWT base64 padding');\n    return input;\n  }\n}","// src/core/detectors/plugins/IbmDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class IbmDetector extends RegexBasedDetector {\n  public secretType = 'IBM Cloud Credentials';\n\n  /**\n   * Detects:\n   * - IAM API keys (44-char alphanumeric)\n   * - COS HMAC secret keys (48-char hex)\n   */\n  public tokenRegex = new RegExp(\n    [\n      // 1. IBM IAM API key in context: ibm_cloud_api_key=...\n      '(?:ibm[_\\\\-]?cloud[_\\\\-]?iam|cloud[_\\\\-]?iam|ibm[_\\\\-]?cloud|ibm[_\\\\-]?iam|ibm|iam|cloud)?[_\\\\-]?(api)?[_\\\\-]?(key|pwd|password|pass|token)[_\\\\-]?[\"\\']?([a-zA-Z0-9_\\\\-]{44})(?![a-zA-Z0-9_\\\\-])',\n\n      // 2. COS HMAC secret keys (contextual): ibm-cos-secret-key\n      '(?:ibm[-_]?cos[-_]?hmac|cos[-_]?hmac|ibm[-_]?cos|ibm[-_]?hmac|hmac|cos)?[-_]?secret[-_]?key[\"\\']?([a-f0-9]{48})(?![a-f0-9])'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/AWSDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class AWSDetector extends RegexBasedDetector {\n  public secretType = 'AWS Secrets';\n\n  /**\n   * Conjunto de expresiones para múltiples tipos de secretos AWS.\n   */\n  public tokenRegex = new RegExp(\n    [\n      // 1. AWS Access Key ID (AKIA, ASIA, etc.)\n      '(?<![A-Z0-9])[A3T][A-Z0-9]{16}(?![A-Z0-9])', // A3T-style\n      '(?<![A-Z0-9])(AKIA|ASIA|ABIA|ACCA)[0-9A-Z]{16}(?![A-Z0-9])', // Classic patterns\n\n      // 2. AWS Secret Access Key (base64-like, 40 chars)\n      '(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])',\n\n      // 3. AWS credentials with context (key|secret|token)\n      '(aws|amazon)?[^a-zA-Z0-9]?(key|pwd|pw|password|pass|token)[^a-zA-Z0-9]{0,3}[\"\\']([A-Za-z0-9/+=]{40,})[\"\\']',\n\n      // 4. AWS CLI config format\n      '\\\\[default\\\\]\\\\s*aws_access_key_id\\\\s*=\\\\s*[A-Z0-9]{20}\\\\s*aws_secret_access_key\\\\s*=\\\\s*[A-Za-z0-9/+=]{40}',\n\n      // 5. AWS KMS Key IDs (UUIDs prefixed with alias/ or key/)\n      'arn:aws:kms:[a-z0-9-]+:\\\\d{12}:key/[a-f0-9-]{36}',\n      'alias/[A-Za-z0-9/_+=.@-]+',\n\n      // 6. AWS ARNs (S3, Lambda, SES, etc.)\n      'arn:aws:[a-z0-9-]+:[a-z0-9-]*:\\\\d{12}:[^\\\\s\\'\"]+',\n\n      // 7. AWS session token (variable name + base64)\n      '(aws_session_token|aws_security_token)[\\\\s:=\\'\"]+([A-Za-z0-9/+=]{16,})'\n    ].join('|'),\n    'gi'\n  );\n}","// NewRelicDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class NewRelicDetector extends RegexBasedDetector {\n  public secretType = 'New Relic API Keys';\n\n  public tokenRegex = new RegExp(\n    [\n      \"NEW_RELIC_LICENSE_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{40}[\\\"']?\",\n      \"NEW_RELIC_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// SentryDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SentryDetector extends RegexBasedDetector {\n  public secretType = 'Sentry Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"SENTRY_DSN\\s*[:=]\\s*[\\\"']?https://[a-zA-Z0-9]+@[a-zA-Z0-9.-]+\\/[0-9]+[\\\"']?\",\n      \"SENTRY_AUTH_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// MixpanelDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MixpanelDetector extends RegexBasedDetector {\n  public secretType = 'Mixpanel Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"MIXPANEL_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AmplitudeDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AmplitudeDetector extends RegexBasedDetector {\n  public secretType = 'Amplitude API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AMPLITUDE_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// LogtailDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class LogtailDetector extends RegexBasedDetector {\n  public secretType = 'Logtail / Betterstack Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"LOGTAIL_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// DatadogDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class DatadogDetector extends RegexBasedDetector {\n  public secretType = 'Datadog API Keys';\n\n  public tokenRegex = new RegExp(\n    [\n      \"DATADOG_API_KEY\\s*[:=]\\s*[\\\"']?[a-z0-9]{32}[\\\"']?\",\n      \"DD_API_KEY\\s*[:=]\\s*[\\\"']?[a-z0-9]{32}[\\\"']?\",\n      \"DD_APP_KEY\\s*[:=]\\s*[\\\"']?[a-z0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// ReplicateDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ReplicateDetector extends RegexBasedDetector {\n  public secretType = 'Replicate API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"REPLICATE_API_TOKEN\\s*[:=]\\s*[\\\"']?[a-z0-9_-]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// VespaDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class VespaDetector extends RegexBasedDetector {\n  public secretType = 'Vespa Cloud API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"VESPA_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// VertexAIDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class VertexAIDetector extends RegexBasedDetector {\n  public secretType = 'Google Vertex AI Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AIza[0-9A-Za-z\\-_]{35}\",\n      \"GOOGLE_VERTEX_API_KEY\\s*[:=]\\s*[\\\"']?AIza[0-9A-Za-z\\-_]{35}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// BasetenDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class BasetenDetector extends RegexBasedDetector {\n  public secretType = 'Baseten API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"BASETEN_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AnthropicDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AnthropicDetector extends RegexBasedDetector {\n  public secretType = 'Anthropic API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"cla-[a-zA-Z0-9]{40,}\",\n      \"ANTHROPIC_API_KEY\\s*[:=]\\s*[\\\"']?cla-[a-zA-Z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// StabilityAIDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class StabilityAIDetector extends RegexBasedDetector {\n  public secretType = 'Stability AI Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"stability-[a-zA-Z0-9]{40,}\",\n      \"STABILITY_API_KEY\\s*[:=]\\s*[\\\"']?stability-[a-zA-Z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// WeaviateDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class WeaviateDetector extends RegexBasedDetector {\n  public secretType = 'Weaviate API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"WEAVIATE_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{32,}[\\\"']?\",\n      \"Authorization:\\s*Bearer\\s*[a-zA-Z0-9-_]{20,}\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// LangSmithDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class LangSmithDetector extends RegexBasedDetector {\n  public secretType = 'LangSmith API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"LANGSMITH_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// OpenAIDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class OpenAIDetector extends RegexBasedDetector {\n  public secretType = 'OpenAI API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"sk-[a-zA-Z0-9]{48}\",\n      \"OPENAI_API_KEY\\s*[:=]\\s*[\\\"']?sk-[a-zA-Z0-9]{48}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// ChromaDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ChromaDetector extends RegexBasedDetector {\n  public secretType = 'Chroma API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CHROMA_API_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// HuggingFaceDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class HuggingFaceDetector extends RegexBasedDetector {\n  public secretType = 'HuggingFace Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"hf_[a-zA-Z0-9]{32,}\",\n      \"HUGGINGFACEHUB_API_TOKEN\\s*[:=]\\s*[\\\"']?hf_[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// LangChainDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class LangChainDetector extends RegexBasedDetector {\n  public secretType = 'LangChain API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"LANGCHAIN_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{20,}[\\\"']?\",\n      \"langchain-js\\.vercel\\.app\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// MistralDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class MistralDetector extends RegexBasedDetector {\n  public secretType = 'Mistral API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"mistral-[a-zA-Z0-9]{40,}\",\n      \"MISTRAL_API_KEY\\s*[:=]\\s*[\\\"']?mistral-[a-zA-Z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PineconeDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PineconeDetector extends RegexBasedDetector {\n  public secretType = 'Pinecone API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"PINECONE_API_KEY\\s*[:=]\\s*[\\\"']?[a-z0-9-]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// QdrantDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class QdrantDetector extends RegexBasedDetector {\n  public secretType = 'Qdrant API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"QDRANT_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CohereDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CohereDetector extends RegexBasedDetector {\n  public secretType = 'Cohere API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"cohere-[a-zA-Z0-9]{32,}\",\n      \"COHERE_API_KEY\\s*[:=]\\s*[\\\"']?cohere-[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PerplexityDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PerplexityDetector extends RegexBasedDetector {\n  public secretType = 'Perplexity API Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"PERPLEXITY_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9\\-_]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// BitbucketTokenDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class BitbucketTokenDetector extends RegexBasedDetector {\n  public secretType = 'Bitbucket Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"bitbucket_(client_id|secret)\\s*[:=]\\s*[\\\"']?[A-Za-z0-9-_]{20,}[\\\"']?\",\n      \"BITBUCKET_(CLIENT|SECRET)_KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9-_]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CircleCITokenDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CircleCITokenDetector extends RegexBasedDetector {\n  public secretType = 'CircleCI Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CIRCLECI_API_TOKEN\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{20,}[\\\"']?\",\n      \"circleci_token\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AzureDevOpsDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AzureDevOpsDetector extends RegexBasedDetector {\n  public secretType = 'Azure DevOps Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AZURE_DEVOPS_(TOKEN|PAT)\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n      \"ado_token\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{20,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// NetlifyDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class NetlifyDetector extends RegexBasedDetector {\n  public secretType = 'Netlify Personal Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"NETLIFY_AUTH_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{40}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// VercelDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class VercelDetector extends RegexBasedDetector {\n  public secretType = 'Vercel Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"VERCEL_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{64,}[\\\"']?\",\n      \"vercel\\.com.*token=[a-zA-Z0-9_-]{64,}\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// DigitalOceanDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class DigitalOceanDetector extends RegexBasedDetector {\n  public secretType = 'DigitalOcean Personal Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"do_(prod|dev)?_?token\\s*[:=]\\s*[\\\"']?[a-f0-9]{64}[\\\"']?\",\n      \"DIGITALOCEAN_ACCESS_TOKEN\\s*[:=]\\s*[\\\"']?[a-f0-9]{64}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","import { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class GcpKeyDetector extends RegexBasedDetector {\n  public secretType = 'GCP Service Account Key';\n\n  public tokenRegex = new RegExp(\n    [\n      '\\\\\\\"type\\\\\\\":\\\\s*\\\\\\\"service_account\\\\\\\"',\n      '\\\\\\\"project_id\\\\\\\":\\\\s*\\\\\\\"[a-z0-9\\\\-]+\\\\\\\"',\n      '\\\\\\\"private_key_id\\\\\\\":\\\\s*\\\\\\\"[a-f0-9]{40}\\\\\\\"',\n      '\\\\\\\"private_key\\\\\\\":\\\\s*\\\\\\\"-----BEGIN PRIVATE KEY-----[\\\\s\\\\S]+?-----END PRIVATE KEY-----\\\\\\\"'\n    ].join('|'),\n    'gi'\n  );\n}","// HerokuDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class HerokuDetector extends RegexBasedDetector {\n  public secretType = 'Heroku API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"HEROKU_API_KEY\\s*[:=]\\s*[\\\"']?[a-f0-9]{32}[\\\"']?\",\n      \"Authorization:\\s*Bearer\\s*[a-f0-9]{32}\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CloudflareDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CloudflareDetector extends RegexBasedDetector {\n  public secretType = 'Cloudflare API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CF_API_KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{37}[\\\"']?\",\n      \"CF_API_EMAIL\\s*[:=]\\s*[\\\"']?[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// RailwayDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class RailwayDetector extends RegexBasedDetector {\n  public secretType = 'Railway Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"RAILWAY_API_TOKEN\\s*[:=]\\s*[\\\"']?[A-Za-z0-9_-]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AlibabaCloudDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AlibabaCloudDetector extends RegexBasedDetector {\n  public secretType = 'Alibaba Cloud Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"accessKeyId\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{16,}[\\\"']?\",\n      \"accessKeySecret\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","import { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class OracleCloudDetector extends RegexBasedDetector {\n  public secretType = 'Oracle Cloud API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"\\\\\\\"user\\\\\\\":\\\\s*\\\\\\\"ocid1\\\\.user\\\\.oc1\\\\.\\\\.[a-zA-Z0-9_]+\\\\\\\"\",\n      \"\\\\\\\"fingerprint\\\\\\\":\\\\s*\\\\\\\"[a-fA-F0-9:]{47}\\\\\\\"\",\n      \"\\\\\\\"key\\\\\\\":\\\\s*\\\\\\\"-----BEGIN PRIVATE KEY-----[\\\\s\\\\S]+?-----END PRIVATE KEY-----\\\\\\\"\"\n    ].join('|'),\n    'gi'\n  );\n}","// AwsKeyDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AwsKeyDetector extends RegexBasedDetector {\n  public secretType = 'AWS Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AKIA[0-9A-Z]{16}\",\n      \"ASIA[0-9A-Z]{16}\",\n      \"A3T[A-Z0-9]{16}\",\n      \"AWS_(ACCESS|SECRET|SESSION)?_?KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9/+=]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// IbmCloudDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class IbmCloudDetector extends RegexBasedDetector {\n  public secretType = 'IBM Cloud IAM Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"iam_apikey\\s*[:=]\\s*[\\\"']?[A-Za-z0-9\\-_]{44}[\\\"']?\",\n      \"IBMCLOUD_API_KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9\\-_]{44}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// RenderDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class RenderDetector extends RegexBasedDetector {\n  public secretType = 'Render API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"RENDER_API_KEY\\s*[:=]\\s*[\\\"']?[A-Za-z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AzureKeyDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AzureKeyDetector extends RegexBasedDetector {\n  public secretType = 'Azure Credentials / Tokens';\n\n  public tokenRegex = new RegExp(\n    [\n      \"AZURE_(CLIENT|SUBSCRIPTION|TENANT|SECRET)_ID\\s*[:=]\\s*[\\\"']?[A-Za-z0-9-]{32,}[\\\"']?\",\n      \"DefaultEndpointsProtocol=https;AccountName=[a-z0-9]+;AccountKey=[A-Za-z0-9+/=]{88}\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// src/core/detectors/plugins/PrivateKeyDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class PrivateKeyDetector extends RegexBasedDetector {\n  public secretType = 'Private Key';\n\n  public tokenRegex = new RegExp(\n    [\n      '-----BEGIN DSA PRIVATE KEY-----',\n      '-----BEGIN EC PRIVATE KEY-----',\n      '-----BEGIN OPENSSH PRIVATE KEY-----',\n      '-----BEGIN PGP PRIVATE KEY BLOCK-----',\n      '-----BEGIN PRIVATE KEY-----',\n      '-----BEGIN ENCRYPTED PRIVATE KEY-----',\n      '-----BEGIN RSA PRIVATE KEY-----',\n      '-----BEGIN SSH2 ENCRYPTED PRIVATE KEY-----',\n      '-----BEGIN SIGSTORE PRIVATE KEY-----',\n      '-----BEGIN APPLE DEVELOPMENT PRIVATE KEY-----',\n      '-----BEGIN BITCOIN PRIVATE KEY-----',\n      '-----BEGIN ETHEREUM PRIVATE KEY-----',\n      'PuTTY-User-Key-File-2'\n    ]\n      .map(s => s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'))\n      .join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/AzureDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class AzureDetector extends RegexBasedDetector {\n  public secretType = 'Azure Secrets';\n\n  public tokenRegex = new RegExp(\n    [\n      // 1. Shared Access Signature (SAS Token) – starts with ?sv=...&sig=...\n      '\\\\?sv=[^\\\\s&]+&ss=[^\\\\s&]+&srt=[^\\\\s&]+&sp=[^\\\\s&]+&se=[^\\\\s&]+&st=[^\\\\s&]+&spr=[^\\\\s&]+&sig=[^\\\\s&]+',\n\n      // 2. Azure Storage Account Key (base64-like, usually 88+ chars)\n      'AccountKey=([A-Za-z0-9+/=]{80,})',\n\n      // 3. Azure Key Vault URI\n      'https://[a-z0-9-]+\\\\.vault\\\\.azure\\\\.net/?',\n\n      // 4. Azure Client Secret (base64-like)\n      '(client_secret|app_secret)[^a-zA-Z0-9]{0,3}[\"\\']([A-Za-z0-9+/=]{40,})[\"\\']',\n\n      // 5. Azure Client ID / Tenant ID (GUID format)\n      '\\\\b[0-9a-fA-F]{8}\\\\b-[0-9a-fA-F]{4}\\\\b-[0-9a-fA-F]{4}\\\\b-[0-9a-fA-F]{4}\\\\b-[0-9a-fA-F]{12}\\\\b',\n\n      // 6. Azure connection string (composite format)\n      'DefaultEndpointsProtocol=https;AccountName=[a-z0-9]+;AccountKey=[A-Za-z0-9+/=]{80,};EndpointSuffix=core\\\\.windows\\\\.net'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/SendgridDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class SendgridDetector extends RegexBasedDetector {\n  public secretType = 'SendGrid API Key';\n\n  /**\n   * Matches SendGrid keys like:\n   * SG.xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n   */\n  public tokenRegex = new RegExp(\n    [\n      // Exact structure: SG.<22 chars>.<43 chars>\n      'SG\\\\.[a-zA-Z0-9_-]{22}\\\\.[a-zA-Z0-9_-]{43}',\n\n      // Optional: context-based (e.g., SENDGRID_API_KEY=...)\n      '(SENDGRID_(API)?KEY)[\"\\']?[:=]\\\\s*[\"\\']?SG\\\\.[a-zA-Z0-9_-]{22}\\\\.[a-zA-Z0-9_-]{43}'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/GitLabTokenDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class GitLabTokenDetector extends RegexBasedDetector {\n  public secretType = 'GitLab Token';\n\n  /**\n   * Detects various GitLab tokens including:\n   * - Personal Access Token\n   * - Deploy Token\n   * - Feed Token\n   * - OAuth Access Token\n   * - Runner Token\n   * - CI/CD Token\n   * - Trigger Token\n   * - Agent Token\n   * - OAuth App Secret\n   * See: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html\n   */\n  public tokenRegex = new RegExp(\n    [\n      // 1. PAT, Deploy, Feed, OAuth Access, Runner Token\n      '(glpat|gldt|glft|glsoat|glrt)-[A-Za-z0-9_-]{20,50}(?!\\\\w)',\n\n      // 2. Runner Registration Token\n      'GR1348941[A-Za-z0-9_-]{20,50}(?!\\\\w)',\n\n      // 3. CI/CD Job Token (glcbt- with optional prefix)\n      'glcbt-(?:[0-9a-fA-F]{2}_)?[A-Za-z0-9_-]{20,50}(?!\\\\w)',\n\n      // 4. Incoming Mail Token\n      'glimt-[A-Za-z0-9_-]{25}(?!\\\\w)',\n\n      // 5. Trigger Token\n      'glptt-[A-Za-z0-9_-]{40}(?!\\\\w)',\n\n      // 6. Agent Token (long)\n      'glagent-[A-Za-z0-9_-]{50,1024}(?!\\\\w)',\n\n      // 7. OAuth App Secret\n      'gloas-[A-Za-z0-9_-]{64}(?!\\\\w)'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/SquareOAuthDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class SquareOAuthDetector extends RegexBasedDetector {\n  public secretType = 'Square OAuth Secret';\n\n  /**\n   * Detects Square OAuth secrets like:\n   * sq0csp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n   */\n  public tokenRegex = /sq0csp-[0-9A-Za-z\\-_]{43}/gi;\n}","// SaasquatchDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SaasquatchDetector extends RegexBasedDetector {\n  public secretType = 'SaaSquatch API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"SAASQUATCH_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// SegmentDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class SegmentDetector extends RegexBasedDetector {\n  public secretType = 'Segment Write Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"SEGMENT_WRITE_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// ImgixDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class ImgixDetector extends RegexBasedDetector {\n  public secretType = 'Imgix Secure Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"IMGIX_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{16,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CalendlyDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CalendlyDetector extends RegexBasedDetector {\n  public secretType = 'Calendly API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CALENDLY_PERSONAL_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// IntercomDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class IntercomDetector extends RegexBasedDetector {\n  public secretType = 'Intercom Access Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"INTERCOM_ACCESS_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9-_]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// LinearDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class LinearDetector extends RegexBasedDetector {\n  public secretType = 'Linear API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"LINEAR_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{40,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// PosthogDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class PosthogDetector extends RegexBasedDetector {\n  public secretType = 'PostHog Project API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"POSTHOG_API_KEY\\s*[:=]\\s*[\\\"']?[a-z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CrispDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CrispDetector extends RegexBasedDetector {\n  public secretType = 'Crisp Chat Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CRISP_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// AlgoliaDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class AlgoliaDetector extends RegexBasedDetector {\n  public secretType = 'Algolia API Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"ALGOLIA_API_KEY\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32}[\\\"']?\",\n      \"ALGOLIA_APPLICATION_ID\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// CloudinaryDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class CloudinaryDetector extends RegexBasedDetector {\n  public secretType = 'Cloudinary API Credentials';\n\n  public tokenRegex = new RegExp(\n    [\n      \"CLOUDINARY_URL\\s*[:=]\\s*[\\\"']?cloudinary://[a-z0-9]+:[a-z0-9]+@[a-z0-9]+[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// FathomDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class FathomDetector extends RegexBasedDetector {\n  public secretType = 'Fathom Analytics Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"FATHOM_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9]{32,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// TypeformDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class TypeformDetector extends RegexBasedDetector {\n  public secretType = 'Typeform Personal Token';\n\n  public tokenRegex = new RegExp(\n    [\n      \"TYPEFORM_TOKEN\\s*[:=]\\s*[\\\"']?[a-zA-Z0-9_-]{30,}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// StripeCliDetector.ts\nimport { RegexBasedDetector } from '../RegexBaseDetector.js';\n\nexport class StripeCliDetector extends RegexBasedDetector {\n  public secretType = 'Stripe CLI Key';\n\n  public tokenRegex = new RegExp(\n    [\n      \"STRIPE_API_KEY\\s*[:=]\\s*[\\\"']?sk_live_[a-zA-Z0-9]{24}[\\\"']?\",\n      \"STRIPE_SECRET_KEY\\s*[:=]\\s*[\\\"']?sk_live_[a-zA-Z0-9]{24}[\\\"']?\",\n    ].join('|'),\n    'gi'\n  );\n}\n","// src/core/detectors/plugins/SoftlayerDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class SoftlayerDetector extends RegexBasedDetector {\n  public secretType = 'SoftLayer Credentials';\n\n  /**\n   * Detects:\n   * - Variables como softlayer_api_key, sl_password, etc.\n   * - Tokens embebidos en endpoints SOAP\n   */\n  public tokenRegex = new RegExp(\n    [\n      // Variables: softlayer_api_key, sl_password, sl-token, etc.\n      '(?:softlayer|sl)[_-]?(?:api)?[_-]?(?:key|pwd|password|pass|token)[_-]?[a-z0-9]{64}',\n\n      // Endpoint-style: https://api.softlayer.com/soap/v3/<token>\n      'https?:\\\\/\\\\/api\\\\.softlayer\\\\.com\\\\/soap\\\\/v3(?:\\\\.1)?\\\\/[a-z0-9]{64}'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/GitHubTokenDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class GitHubTokenDetector extends RegexBasedDetector {\n  public secretType = 'GitHub Token';\n\n  /**\n   * Detects GitHub tokens including Personal Access, OAuth, GitHub Apps and Actions tokens.\n   */\n  public tokenRegex = new RegExp(\n    [\n      // All known GitHub token types\n      '(ghp|gho|ghu|ghs|ghr|gha)_[A-Za-z0-9_]{36}'\n    ].join('|'),\n    'gi'\n  );\n}","// src/core/detectors/plugins/StripeDetector.ts\n\nimport { RegexBasedDetector } from './RegexBaseDetector.js';\n\nexport class StripeDetector extends RegexBasedDetector {\n  public secretType = \"Stripe Access Key\";\n\n  // Regex para r|s k_live_ con 24 alfanum\n  public tokenRegex = /(?:r|s)k_live_[0-9a-zA-Z]{24}/;\n\n  /**\n   * Si quisieras replicar la verificación con la API de Stripe,\n   * podrías añadir un método async verifySecret(secret: string): Promise<VerifiedResult> { ... }\n   */\n}\n","import { MongoDbDetector } from './plugins/database/MongoDbDetector.js';\nimport { PostgreSQLDetector } from './plugins/database/PostgreSQLDetector.js';\nimport { MySQLDetector } from './plugins/database/MySQLDetector.js';\nimport { RedisDetector } from './plugins/database/RedisDetector.js';\nimport { ElasticsearchDetector } from './plugins/database/ElasticsearchDetector.js';\nimport { FirebaseDetector } from './plugins/database/FirebaseDetector.js';\nimport { SupabaseDetector } from './plugins/database/SupabaseDetector.js';\nimport { GoogleCloudStorageDetector } from './plugins/database/GoogleCloudStorageDetector.js';\nimport { CloudantDetector } from './plugins/database/CloudantDetector.js';\nimport { SendGridDetector } from './plugins/messages/SendGridDetector.js';\nimport { SlackDetector } from './plugins/messages/SlackDetector.js';\nimport { WhatsAppCloudDetector } from './plugins/messages/WhatsAppCloudDetector.js';\nimport { VonageDetector } from './plugins/messages/VonageDetector.js';\nimport { PlivoDetector } from './plugins/messages/PlivoDetector.js';\nimport { MailchimpDetector } from './plugins/messages/MailchimpDetector.js';\nimport { PostmarkDetector } from './plugins/messages/PostmarkDetector.js';\nimport { ZoomApiDetector } from './plugins/messages/ZoomApiDetector.js';\nimport { SmtpGenericDetector } from './plugins/messages/SmtpGenericDetector.js';\nimport { DiscordBotTokenDetector } from './plugins/messages/DiscordBotTokenDetector.js';\nimport { MailgunDetector } from './plugins/messages/MailgunDetector.js';\nimport { FirebaseAuthDetector } from './plugins/identity/FirebaseAuthDetector.js';\nimport { OktaDetector } from './plugins/identity/OktaDetector.js';\nimport { ClerkDetector } from './plugins/identity/ClerkDetector.js';\nimport { SuperTokensDetector } from './plugins/identity/SuperTokensDetector.js';\nimport { Auth0Detector } from './plugins/identity/Auth0Detector.js';\nimport { NpmTokenDetector } from './plugins/NpmTokenDetector.js';\nimport { JenkinsDetector } from './plugins/security/JenkinsDetector.js';\nimport { GitHubActionsDetector } from './plugins/security/GitHubActionsDetector.js';\nimport { TerraformCloudDetector } from './plugins/security/TerraformCloudDetector.js';\nimport { DroneCiDetector } from './plugins/security/DroneCiDetector.js';\nimport { PulumiDetector } from './plugins/security/PulumiDetector.js';\nimport { BuddyCiDetector } from './plugins/security/BuddyCiDetector.js';\nimport { GitLabCiDetector } from './plugins/security/GitLabCiDetector.js';\nimport { CodefreshDetector } from './plugins/security/CodefreshDetector.js';\nimport { TravisCiDetector } from './plugins/security/TravisCiDetector.js';\nimport { CircleCiDetector } from './plugins/security/CircleCiDetector.js';\nimport { BitbucketCiDetector } from './plugins/security/BitbucketCiDetector.js';\nimport { TwilioKeyDetector } from './plugins/TwilioKeyDetector.js';\nimport { JwtTokenDetector } from './plugins/JwtTokenDetector.js';\nimport { IbmDetector } from './plugins/IbmDetector.js';\nimport { AWSDetector } from './plugins/AWSDetector.js';\nimport { NewRelicDetector } from './plugins/logs/NewRelicDetector.js';\nimport { SentryDetector } from './plugins/logs/SentryDetector.js';\nimport { MixpanelDetector } from './plugins/logs/MixpanelDetector.js';\nimport { AmplitudeDetector } from './plugins/logs/AmplitudeDetector.js';\nimport { LogtailDetector } from './plugins/logs/LogtailDetector.js';\nimport { DatadogDetector } from './plugins/logs/DatadogDetector.js';\nimport { ReplicateDetector } from './plugins/ai/ReplicateDetector.js';\nimport { VespaDetector } from './plugins/ai/VespaDetector.js';\nimport { VertexAIDetector } from './plugins/ai/VertexAIDetector.js';\nimport { BasetenDetector } from './plugins/ai/BasetenDetector.js';\nimport { AnthropicDetector } from './plugins/ai/AnthropicDetector.js';\nimport { StabilityAIDetector } from './plugins/ai/StabilityAIDetector.js';\nimport { WeaviateDetector } from './plugins/ai/WeaviateDetector.js';\nimport { LangSmithDetector } from './plugins/ai/LangSmithDetector.js';\nimport { OpenAIDetector } from './plugins/ai/OpenAIDetector.js';\nimport { ChromaDetector } from './plugins/ai/ChromaDetector.js';\nimport { HuggingFaceDetector } from './plugins/ai/HuggingFaceDetector.js';\nimport { LangChainDetector } from './plugins/ai/LangChainDetector.js';\nimport { MistralDetector } from './plugins/ai/MistralDetector.js';\nimport { PineconeDetector } from './plugins/ai/PineconeDetector.js';\nimport { QdrantDetector } from './plugins/ai/QdrantDetector.js';\nimport { CohereDetector } from './plugins/ai/CohereDetector.js';\nimport { PerplexityDetector } from './plugins/ai/PerplexityDetector.js';\nimport { BitbucketTokenDetector } from './plugins/deployment/BitbucketTokenDetector.js';\nimport { CircleCITokenDetector } from './plugins/deployment/CircleCITokenDetector.js';\nimport { AzureDevOpsDetector } from './plugins/deployment/AzureDevOpsDetector.js';\nimport { NetlifyDetector } from './plugins/cloud/NetlifyDetector.js';\nimport { VercelDetector } from './plugins/cloud/VercelDetector.js';\nimport { DigitalOceanDetector } from './plugins/cloud/DigitalOceanDetector.js';\nimport { GcpKeyDetector } from './plugins/cloud/GcpKeyDetector.js';\nimport { HerokuDetector } from './plugins/cloud/HerokuDetector.js';\nimport { CloudflareDetector } from './plugins/cloud/CloudflareDetector.js';\nimport { RailwayDetector } from './plugins/cloud/RailwayDetector.js';\nimport { AlibabaCloudDetector } from './plugins/cloud/AlibabaCloudDetector.js';\nimport { OracleCloudDetector } from './plugins/cloud/OracleCloudDetector.js';\nimport { AwsKeyDetector } from './plugins/cloud/AwsKeyDetector.js';\nimport { IbmCloudDetector } from './plugins/cloud/IbmCloudDetector.js';\nimport { RenderDetector } from './plugins/cloud/RenderDetector.js';\nimport { AzureKeyDetector } from './plugins/cloud/AzureKeyDetector.js';\nimport { PrivateKeyDetector } from './plugins/PrivateKeyDetector.js';\nimport { AzureDetector } from './plugins/AzureDetector.js';\nimport { SendgridDetector } from './plugins/SendgridDetector.js';\nimport { GitLabTokenDetector } from './plugins/GitLabTokenDetector.js';\nimport { SquareOAuthDetector } from './plugins/SquareOAuthDetector.js';\nimport { SaasquatchDetector } from './plugins/saas/SaasquatchDetector.js';\nimport { SegmentDetector } from './plugins/saas/SegmentDetector.js';\nimport { ImgixDetector } from './plugins/saas/ImgixDetector.js';\nimport { CalendlyDetector } from './plugins/saas/CalendlyDetector.js';\nimport { IntercomDetector } from './plugins/saas/IntercomDetector.js';\nimport { LinearDetector } from './plugins/saas/LinearDetector.js';\nimport { PosthogDetector } from './plugins/saas/PosthogDetector.js';\nimport { CrispDetector } from './plugins/saas/CrispDetector.js';\nimport { AlgoliaDetector } from './plugins/saas/AlgoliaDetector.js';\nimport { CloudinaryDetector } from './plugins/saas/CloudinaryDetector.js';\nimport { FathomDetector } from './plugins/saas/FathomDetector.js';\nimport { TypeformDetector } from './plugins/saas/TypeformDetector.js';\nimport { StripeCliDetector } from './plugins/saas/StripeCliDetector.js';\nimport { SoftlayerDetector } from './plugins/SoftlayerDetector.js';\nimport { GitHubTokenDetector } from './plugins/GitHubTokenDetector.js';\nimport { StripeDetector } from './plugins/StripeDetector.js';\nimport { ISecretDetector } from './plugins/ISecretDetector.js';\n\nconst plugins: ISecretDetector[] = [\n    new StripeDetector(),\n    new MongoDbDetector(),\n    new PostgreSQLDetector(),\n    new MySQLDetector(),\n    new RedisDetector(),\n    new ElasticsearchDetector(),\n    new FirebaseDetector(),\n    new SupabaseDetector(),\n    new GoogleCloudStorageDetector(),\n    new CloudantDetector(),\n    new SendGridDetector(),\n    new SlackDetector(),\n    new WhatsAppCloudDetector(),\n    new VonageDetector(),\n    new PlivoDetector(),\n    new MailchimpDetector(),\n    new PostmarkDetector(),\n    new ZoomApiDetector(),\n    new SmtpGenericDetector(),\n    new DiscordBotTokenDetector(),\n    new MailgunDetector(),\n    new FirebaseAuthDetector(),\n    new OktaDetector(),\n    new ClerkDetector(),\n    new SuperTokensDetector(),\n    new Auth0Detector(),\n    new NpmTokenDetector(),\n    new JenkinsDetector(),\n    new GitHubActionsDetector(),\n    new TerraformCloudDetector(),\n    new DroneCiDetector(),\n    new PulumiDetector(),\n    new BuddyCiDetector(),\n    new GitLabCiDetector(),\n    new CodefreshDetector(),\n    new TravisCiDetector(),\n    new CircleCiDetector(),\n    new BitbucketCiDetector(),\n    new TwilioKeyDetector(),\n    new JwtTokenDetector(),\n    new IbmDetector(),\n    new AWSDetector(),\n    new NewRelicDetector(),\n    new SentryDetector(),\n    new MixpanelDetector(),\n    new AmplitudeDetector(),\n    new LogtailDetector(),\n    new DatadogDetector(),\n    new ReplicateDetector(),\n    new VespaDetector(),\n    new VertexAIDetector(),\n    new BasetenDetector(),\n    new AnthropicDetector(),\n    new StabilityAIDetector(),\n    new WeaviateDetector(),\n    new LangSmithDetector(),\n    new OpenAIDetector(),\n    new ChromaDetector(),\n    new HuggingFaceDetector(),\n    new LangChainDetector(),\n    new MistralDetector(),\n    new PineconeDetector(),\n    new QdrantDetector(),\n    new CohereDetector(),\n    new PerplexityDetector(),\n    new BitbucketTokenDetector(),\n    new CircleCITokenDetector(),\n    new AzureDevOpsDetector(),\n    new NetlifyDetector(),\n    new VercelDetector(),\n    new DigitalOceanDetector(),\n    new GcpKeyDetector(),\n    new HerokuDetector(),\n    new CloudflareDetector(),\n    new RailwayDetector(),\n    new AlibabaCloudDetector(),\n    new OracleCloudDetector(),\n    new AwsKeyDetector(),\n    new IbmCloudDetector(),\n    new RenderDetector(),\n    new AzureKeyDetector(),\n    new PrivateKeyDetector(),\n    new AzureDetector(),\n    new SendgridDetector(),\n    new GitLabTokenDetector(),\n    new SquareOAuthDetector(),\n    new SaasquatchDetector(),\n    new SegmentDetector(),\n    new ImgixDetector(),\n    new CalendlyDetector(),\n    new IntercomDetector(),\n    new LinearDetector(),\n    new PosthogDetector(),\n    new CrispDetector(),\n    new AlgoliaDetector(),\n    new CloudinaryDetector(),\n    new FathomDetector(),\n    new TypeformDetector(),\n    new StripeCliDetector(),\n    new SoftlayerDetector(),\n    new GitHubTokenDetector(),\n];\n\nexport { plugins };","// ... etc\nimport { StringMetadata } from '../extractors/stringExtractor.js';\nimport { SecretKeyGenerator } from '../helpers/secretKeyGenerator.js';\nimport { SecretMetadata } from '../mainScanner.js';\nimport { plugins } from './plugins.js';\n\n/**\n * Aplica una lista de detectores (plugins) a cada cadena y retorna las detecciones.\n */\nexport function scanWithPlugins(strings: StringMetadata[]): SecretMetadata[] {\n\n\n  const results: SecretMetadata[] = [];\n\n  // Recorremos cada cadena y cada plugin\n  for (const str of strings) {\n    for (const plugin of plugins) {\n      if (plugin.containsSecret(str.value)) {\n        // Generamos la key\n        const key = SecretKeyGenerator.generateKey(\n          'plugins',\n          plugin.secretType,\n          str.filePath,\n          str.variableName ?? '',  // variableName si la tienes\n          str.value\n        );\n\n        // Creamos un SecretMetadata\n        const metadata: SecretMetadata = {\n          value: str.value,\n          key,\n          name: plugin.secretType,\n          confidence: 'high',\n          discoveredBy: 'plugins',\n          filePath: str.filePath,\n          line: str.line,\n          snippet: str.snippet,\n          highlight: str.highlight,\n          snippetLineNumber: str.snippetLineNumber,\n          variableName: str.variableName\n        };\n\n        // Evitar duplicados (opcional)\n        if (!results.some(r => r.value === str.value && r.filePath === str.filePath && r.line === str.line)) {\n          results.push(metadata);\n        }\n      }\n    }\n  }\n\n  return results;\n}\n","// src/core/detectors/keywordDetector.ts\n\n/**\n * KeywordDetector se encarga de detectar nombres de variables sensibles,\n * como \"apikey\", \"password\", \"token\", etc.\n */\nexport class KeywordDetector {\n    public secretType: string = \"Secret Keyword\";\n    private denylistRegexes: RegExp[];\n  \n    constructor() {\n      const patterns = [\n        \"api_?key\", \"auth_?key\", \"service_?key\", \"account_?key\",\n        \"db_?key\", \"database_?key\", \"priv_?key\", \"private_?key\",\n        \"client_?key\", \"db_?pass\", \"database_?pass\", \"key_?pass\",\n        \"password\", \"passwd\", \"pwd\", \"secret\", \"contraseña\", \"contrasena\",\n        \".*api[-_]?key.*\", \".*auth[-_]?key.*\", \".*service[-_]?key.*\", \".*account[-_]?key.*\",\n        \".*db[-_]?key.*\", \".*database[-_]?key.*\", \".*priv[-_]?key.*\", \".*private[-_]?key.*\",\n        \".*client[-_]?key.*\", \".*db[-_]?pass.*\", \".*database[-_]?pass.*\", \".*key[-_]?pass.*\",\n        \".*password.*\", \".*passwd.*\", \".*pwd.*\", \".*secret.*\", \".*contraseña.*\", \".*contrasena.*\",\n        \".*token.*\", \".*session[-_]?id.*\", \".*access[-_]?token.*\", \".*refresh[-_]?token.*\",\n        \".*credential.*\", \".*signature.*\", \".*encrypt.*\", \".*decrypt.*\", \".*certificate.*\",\n        \".*login.*\", \".*user[-_]?name.*\", \".*username.*\", \".*user[-_]?id.*\", \".*userid.*\"\n      ];\n  \n      // Convertimos cada pattern en una RegExp que case toda la variable (con ^ y $).\n      // Para la parte \".*\" en el pattern, se mantiene, y al añadir ^ y $, \n      // obliga a que coincida toda la cadena.\n      this.denylistRegexes = patterns.map(\n        (pattern) => new RegExp(`^${pattern}$`, 'i')\n      );\n    }\n  \n    /**\n     * Recorre una lista de nombres de variables y devuelve\n     * aquellos que encajan con la denylist.\n     */\n    public analyzeVariables(variableNames: string[]): string[] {\n      const results: string[] = [];\n      for (const name of variableNames) {\n        for (const regex of this.denylistRegexes) {\n          if (regex.test(name)) {\n            results.push(name);\n            break; // Pasamos a la siguiente variable en cuanto hay match\n          }\n        }\n      }\n      return results;\n    }\n  \n    /**\n     * Retorna true si el nombre de la variable encaja con alguno\n     * de los patrones sensibles.\n     */\n    public isSensitive(variableName: string): boolean {\n      if (!variableName) return false;\n  \n      for (const regex of this.denylistRegexes) {\n        if (regex.test(variableName)) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n  "],"mappings":"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","names":["dayjs","os","path","import_path","import_fs","import_path","TSParser","TSParser2","JavaScript","Python","Java","CSharp","CPP","Swift","Kotlin","Go","Rust","Ruby","Scala","path","fs","walk","Parser","import_fs","fs","yaml","import_path","path","crypto","path","fs"]}