{"version":3,"file":"index.cjs","sources":["../../src/core/utils.js","../../src/core/detector.js","../../src/core/validator.js"],"sourcesContent":["export function isServerSide() {\n  return typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node;\n}\n\nexport function warnIfClientSide() {\n  if (!isServerSide()) {\n    console.warn('bot-gate: This library is designed for server-side use only. Bot detection requires access to request headers and IP addresses that are not available in the browser.');\n  }\n}\n\nexport function sanitizeIpAddress(ipAddress) {\n  if (!ipAddress || typeof ipAddress !== 'string') return null;\n  \n  let sanitized = ipAddress.trim()\n    .split(',')[0]\n    .trim();\n  \n  // Remove IPv4-mapped IPv6 prefix if present\n  if (sanitized.startsWith('::ffff:')) {\n    sanitized = sanitized.replace(/^::ffff:/, '');\n  }\n  \n  // Handle IPv6 addresses enclosed in brackets (common in HTTP headers)\n  if (sanitized.startsWith('[') && sanitized.endsWith(']')) {\n    sanitized = sanitized.slice(1, -1);\n  }\n  \n  return sanitized;\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nlet userAgentPatterns = null;\nlet compiledPatterns = null;\n\nfunction loadUserAgentPatterns() {\n  if (!userAgentPatterns) {\n    try {\n      const dataPath = path.join(__dirname, '../../data/user-agents.json');\n      \n      if (!fs.existsSync(dataPath)) {\n        console.warn('bot-gate: User agent patterns file not found. Bot detection will be disabled.');\n        userAgentPatterns = { bots: [] };\n        return userAgentPatterns;\n      }\n      \n      const data = fs.readFileSync(dataPath, 'utf8');\n      const parsed = JSON.parse(data);\n      \n      // Validate structure\n      if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.bots)) {\n        console.warn('bot-gate: Invalid user agent patterns format. Expected { bots: [...] }');\n        userAgentPatterns = { bots: [] };\n        return userAgentPatterns;\n      }\n      \n      // Validate each bot entry\n      const validBots = parsed.bots.filter(bot => {\n        if (!bot || typeof bot !== 'object' || !bot.name || !Array.isArray(bot.patterns)) {\n          console.warn(`bot-gate: Invalid bot entry skipped:`, bot);\n          return false;\n        }\n        return true;\n      });\n      \n      userAgentPatterns = { bots: validBots };\n      \n      if (validBots.length === 0) {\n        console.warn('bot-gate: No valid bot patterns found. Bot detection will be disabled.');\n      }\n      \n      // Pre-compile regex patterns for better performance\n      compilePatterns();\n      \n    } catch (error) {\n      console.warn('bot-gate: Failed to load user agent patterns:', error.message);\n      userAgentPatterns = { bots: [] };\n    }\n  }\n  return userAgentPatterns;\n}\n\nfunction compilePatterns() {\n  if (!userAgentPatterns || !userAgentPatterns.bots) {\n    compiledPatterns = [];\n    return;\n  }\n  \n  compiledPatterns = userAgentPatterns.bots.map(bot => {\n    const regexPatterns = bot.patterns.map(pattern => {\n      try {\n        return new RegExp(pattern, 'i');\n      } catch (error) {\n        console.warn(`bot-gate: Invalid regex pattern \"${pattern}\" for bot ${bot.name}:`, error.message);\n        return null;\n      }\n    }).filter(Boolean);\n    \n    return {\n      name: bot.name,\n      type: bot.type,\n      regexPatterns\n    };\n  }).filter(bot => bot.regexPatterns.length > 0);\n}\n\nexport function detectBot(userAgent) {\n  if (!userAgent || typeof userAgent !== 'string') {\n    return null;\n  }\n\n  // Ensure patterns are loaded and compiled\n  if (!compiledPatterns) {\n    loadUserAgentPatterns();\n    if (!compiledPatterns) {\n      compilePatterns();\n    }\n  }\n\n  if (!compiledPatterns || compiledPatterns.length === 0) {\n    return null;\n  }\n\n  for (const bot of compiledPatterns) {\n    for (const regex of bot.regexPatterns) {\n      if (regex.test(userAgent)) {\n        return {\n          name: bot.name,\n          type: bot.type,\n          detected: true,\n          pattern: regex.source\n        };\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function getSupportedBots() {\n  const patterns = loadUserAgentPatterns();\n  return patterns.bots.map(bot => ({\n    name: bot.name,\n    type: bot.type\n  }));\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { detectBot } from './detector.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst ipRangeCache = new Map();\n\n// Cache configuration\nconst CACHE_TTL = 60 * 60 * 1000; // 1 hour in milliseconds\nconst MAX_CACHE_SIZE = 50; // Maximum number of cached bot entries\n\nfunction cleanupCache() {\n  const now = Date.now();\n  const entries = Array.from(ipRangeCache.entries());\n  \n  // Remove expired entries\n  for (const [botName, data] of entries) {\n    if (data.loadedAt && (now - data.loadedAt) > CACHE_TTL) {\n      ipRangeCache.delete(botName);\n    }\n  }\n  \n  // If still over size limit, remove oldest entries\n  if (ipRangeCache.size > MAX_CACHE_SIZE) {\n    const sortedEntries = Array.from(ipRangeCache.entries())\n      .sort(([,a], [,b]) => (a.loadedAt || 0) - (b.loadedAt || 0));\n    \n    const toRemove = sortedEntries.slice(0, ipRangeCache.size - MAX_CACHE_SIZE);\n    for (const [botName] of toRemove) {\n      ipRangeCache.delete(botName);\n    }\n  }\n}\n\n// Periodic cleanup every 10 minutes\nlet cleanupInterval;\nif (typeof setInterval !== 'undefined') {\n  cleanupInterval = setInterval(cleanupCache, 10 * 60 * 1000);\n}\n\nfunction loadBotIpRanges(botName) {\n  if (!ipRangeCache.has(botName)) {\n    // Cleanup cache before adding new entries\n    cleanupCache();\n    try {\n      // Handle applebot-extended using the same IP ranges as applebot\n      let actualBotName = botName.toLowerCase();\n      if (actualBotName === 'applebot-extended') {\n        actualBotName = 'applebot';\n      }\n      \n      const dataPath = path.join(__dirname, `../../data/bots/${actualBotName}.json`);\n      \n      if (!fs.existsSync(dataPath)) {\n        console.warn(`bot-gate: IP ranges file not found for ${botName}. Bot validation will fail for this bot.`);\n        ipRangeCache.set(botName, { ranges: [], error: 'file_not_found' });\n        return ipRangeCache.get(botName);\n      }\n      \n      const data = fs.readFileSync(dataPath, 'utf8');\n      let rawData;\n      \n      try {\n        rawData = JSON.parse(data);\n      } catch (parseError) {\n        console.warn(`bot-gate: Invalid JSON in IP ranges file for ${botName}:`, parseError.message);\n        ipRangeCache.set(botName, { ranges: [], error: 'invalid_json' });\n        return ipRangeCache.get(botName);\n      }\n      \n      // Validate structure\n      if (!rawData || typeof rawData !== 'object') {\n        console.warn(`bot-gate: Invalid IP ranges data structure for ${botName}. Expected object.`);\n        ipRangeCache.set(botName, { ranges: [], error: 'invalid_structure' });\n        return ipRangeCache.get(botName);\n      }\n      \n      // Official API format: { creationTime, prefixes: [{ ipv4Prefix: \"...\" }] }\n      const ranges = rawData.prefixes && Array.isArray(rawData.prefixes)\n        ? rawData.prefixes.map(prefix => prefix.ipv4Prefix || prefix.ipv6Prefix).filter(Boolean)\n        : [];\n      \n      if (ranges.length === 0) {\n        console.warn(`bot-gate: No valid IP ranges found for ${botName}. Bot validation will fail for this bot.`);\n      }\n      \n      ipRangeCache.set(botName, { \n        ranges, \n        loadedAt: Date.now(),\n        error: ranges.length === 0 ? 'no_ranges' : null \n      });\n      \n    } catch (error) {\n      console.warn(`bot-gate: Failed to load IP ranges for ${botName}:`, error.message);\n      ipRangeCache.set(botName, { ranges: [], error: 'load_failed', errorMessage: error.message });\n    }\n  }\n  return ipRangeCache.get(botName);\n}\n\nfunction ipToInt(ip) {\n  return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;\n}\n\nfunction cidrToRange(cidr) {\n  const [ip, prefixLength] = cidr.split('/');\n  const ipInt = ipToInt(ip);\n  const mask = (-1 << (32 - parseInt(prefixLength, 10))) >>> 0;\n  const networkInt = ipInt & mask;\n  const broadcastInt = networkInt | (~mask >>> 0);\n  \n  return {\n    start: networkInt,\n    end: broadcastInt\n  };\n}\n\nfunction expandIpv6(ip) {\n  // Expand IPv6 address to full form\n  if (ip.includes('::')) {\n    const parts = ip.split('::');\n    const left = parts[0] ? parts[0].split(':') : [];\n    const right = parts[1] ? parts[1].split(':') : [];\n    const missing = 8 - left.length - right.length;\n    const middle = Array(missing).fill('0000');\n    return [...left, ...middle, ...right].map(part => part.padStart(4, '0')).join(':');\n  }\n  return ip.split(':').map(part => part.padStart(4, '0')).join(':');\n}\n\nfunction ipv6ToInts(ip) {\n  const expanded = expandIpv6(ip);\n  const parts = expanded.split(':');\n  return parts.map(part => parseInt(part, 16));\n}\n\nfunction isIpv6InRange(ip, range) {\n  if (!ip.includes(':')) return false;\n  \n  if (range.includes('/')) {\n    const [rangeIp, prefixLength] = range.split('/');\n    const prefix = parseInt(prefixLength, 10);\n    \n    if (!rangeIp.includes(':')) return false;\n    \n    const ipParts = ipv6ToInts(ip);\n    const rangeParts = ipv6ToInts(rangeIp);\n    \n    // Check how many complete 16-bit blocks we need to compare\n    const completeBlocks = Math.floor(prefix / 16);\n    const remainingBits = prefix % 16;\n    \n    // Compare complete blocks\n    for (let i = 0; i < completeBlocks; i++) {\n      if (ipParts[i] !== rangeParts[i]) {\n        return false;\n      }\n    }\n    \n    // Compare remaining bits in the partial block\n    if (remainingBits > 0 && completeBlocks < 8) {\n      const mask = (0xFFFF << (16 - remainingBits)) & 0xFFFF;\n      if ((ipParts[completeBlocks] & mask) !== (rangeParts[completeBlocks] & mask)) {\n        return false;\n      }\n    }\n    \n    return true;\n  }\n  \n  // Direct IPv6 comparison\n  if (range.includes(':')) {\n    return expandIpv6(ip) === expandIpv6(range);\n  }\n  \n  return false;\n}\n\nfunction isIpInRange(ip, range) {\n  // Handle IPv6 ranges\n  if (ip.includes(':') || range.includes(':')) {\n    return isIpv6InRange(ip, range);\n  }\n  \n  // Handle IPv4 ranges\n  const ipInt = ipToInt(ip);\n  \n  if (range.includes('/')) {\n    const { start, end } = cidrToRange(range);\n    return ipInt >= start && ipInt <= end;\n  }\n  \n  if (range.includes('-')) {\n    const [startIp, endIp] = range.split('-');\n    const startInt = ipToInt(startIp.trim());\n    const endInt = ipToInt(endIp.trim());\n    return ipInt >= startInt && ipInt <= endInt;\n  }\n  \n  return ipInt === ipToInt(range);\n}\n\nfunction isValidIpAddress(ip) {\n  const ipv4Regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n  const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::([0-9a-fA-F]{1,4}:)+[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)*::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^::$|^([0-9a-fA-F]{1,4}:){1,7}:$|^:(:([0-9a-fA-F]{1,4})){1,7}$|^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$|^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$|^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$|^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$/;\n  \n  return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n}\n\nfunction validateBotByName(botName, ipAddress) {\n  if (!botName || !ipAddress) {\n    return false;\n  }\n\n  const cleanIp = sanitizeIpAddress(ipAddress);\n  if (!cleanIp || !isValidIpAddress(cleanIp)) {\n    return false;\n  }\n\n  const botData = loadBotIpRanges(botName);\n  \n  if (!botData.ranges || botData.ranges.length === 0) {\n    return false;\n  }\n\n  return botData.ranges.some(range => isIpInRange(cleanIp, range));\n}\n\nexport function validateBot(userAgent, ipAddress) {\n  if (!userAgent || !ipAddress) {\n    return false;\n  }\n\n  const cleanIp = sanitizeIpAddress(ipAddress);\n  if (!cleanIp) {\n    console.warn(`bot-gate: Failed to sanitize IP address: ${ipAddress}`);\n    return false;\n  }\n\n  const botInfo = detectBot(userAgent);\n  \n  if (!botInfo) {\n    return false;\n  }\n\n  const isValid = validateBotByName(botInfo.name, cleanIp);\n  if (!isValid) {\n    console.warn(`bot-gate: Bot validation failed for ${botInfo.name} with IP ${cleanIp}. This may indicate a spoofed bot or outdated IP ranges.`);\n  }\n\n  return isValid;\n}\n\n// Export cache management functions for testing and manual cleanup\nexport function clearCache() {\n  ipRangeCache.clear();\n}\n\nexport function getCacheSize() {\n  return ipRangeCache.size;\n}\n\nexport function stopCacheCleanup() {\n  if (cleanupInterval) {\n    clearInterval(cleanupInterval);\n    cleanupInterval = null;\n  }\n}\n\n// Debugging utilities\nexport function debugBotValidation(userAgent, ipAddress) {\n  console.log('bot-gate: Debug validation starting...');\n  console.log(`User-Agent: ${userAgent}`);\n  console.log(`IP Address: ${ipAddress}`);\n  \n  if (!userAgent || !ipAddress) {\n    console.log('❌ Missing required parameters');\n    return { valid: false, reason: 'missing_params' };\n  }\n\n  const cleanIp = sanitizeIpAddress(ipAddress);\n  console.log(`Sanitized IP: ${cleanIp}`);\n  \n  if (!cleanIp) {\n    console.log('❌ IP sanitization failed');\n    return { valid: false, reason: 'ip_sanitization_failed' };\n  }\n\n  if (!isValidIpAddress(cleanIp)) {\n    console.log('❌ Invalid IP address format');\n    return { valid: false, reason: 'invalid_ip_format' };\n  }\n\n  const botInfo = detectBot(userAgent);\n  console.log(`Bot detection result:`, botInfo);\n  \n  if (!botInfo) {\n    console.log('❌ No bot detected in user agent');\n    return { valid: false, reason: 'bot_not_detected' };\n  }\n\n  const botData = loadBotIpRanges(botInfo.name);\n  console.log(`Bot IP ranges loaded: ${botData.ranges.length} ranges`);\n  \n  if (botData.error) {\n    console.log(`❌ Bot data error: ${botData.error}`);\n    return { valid: false, reason: 'bot_data_error', botError: botData.error };\n  }\n\n  const isInRange = botData.ranges.some(range => {\n    const inRange = isIpInRange(cleanIp, range);\n    if (inRange) {\n      console.log(`✅ IP ${cleanIp} matches range: ${range}`);\n    }\n    return inRange;\n  });\n\n  if (!isInRange) {\n    console.log(`❌ IP ${cleanIp} not in any valid ranges for ${botInfo.name}`);\n    console.log('Available ranges:', botData.ranges.slice(0, 5)); // Show first 5 ranges\n  }\n\n  const result = { \n    valid: isInRange, \n    reason: isInRange ? 'valid_bot' : 'ip_not_in_range',\n    botInfo,\n    cleanIp,\n    availableRanges: botData.ranges.length\n  };\n  \n  console.log('bot-gate: Debug validation complete:', result);\n  return result;\n}\n\nexport function getBotValidationInfo(botName) {\n  const botData = loadBotIpRanges(botName);\n  return {\n    botName,\n    rangeCount: botData.ranges.length,\n    error: botData.error,\n    errorMessage: botData.errorMessage,\n    loadedAt: botData.loadedAt,\n    ranges: botData.ranges.slice(0, 10) // First 10 ranges for inspection\n  };\n}\n\nexport function listCachedBots() {\n  return Array.from(ipRangeCache.keys());\n}"],"names":["__dirname","fileURLToPath"],"mappings":"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"}