{"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  return ipAddress.trim()\n    .split(',')[0]\n    .trim()\n    .replace(/^::ffff:/, '');\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;\n\nfunction loadUserAgentPatterns() {\n  if (!userAgentPatterns) {\n    try {\n      const dataPath = path.join(__dirname, '../../data/user-agents.json');\n      const data = fs.readFileSync(dataPath, 'utf8');\n      userAgentPatterns = JSON.parse(data);\n    } catch (error) {\n      console.warn('Failed to load user agent patterns:', error.message);\n      userAgentPatterns = { bots: [] };\n    }\n  }\n  return userAgentPatterns;\n}\n\nexport function detectBot(userAgent) {\n  if (!userAgent || typeof userAgent !== 'string') {\n    return null;\n  }\n\n  const patterns = loadUserAgentPatterns();\n  const normalizedUA = userAgent.toLowerCase();\n\n  for (const bot of patterns.bots) {\n    for (const pattern of bot.patterns) {\n      const regex = new RegExp(pattern.toLowerCase(), 'i');\n      if (regex.test(normalizedUA)) {\n        return {\n          name: bot.name,\n          type: bot.type,\n          detected: true,\n          pattern: pattern\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';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst ipRangeCache = new Map();\n\nfunction loadBotIpRanges(botName) {\n  if (!ipRangeCache.has(botName)) {\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      const data = fs.readFileSync(dataPath, 'utf8');\n      const rawData = JSON.parse(data);\n      \n      // Official API format: { creationTime, prefixes: [{ ipv4Prefix: \"...\" }] }\n      const ranges = rawData.prefixes \n        ? rawData.prefixes.map(prefix => prefix.ipv4Prefix || prefix.ipv6Prefix).filter(Boolean)\n        : [];\n      \n      ipRangeCache.set(botName, { ranges });\n    } catch (error) {\n      console.warn(`Failed to load IP ranges for ${botName}:`, error.message);\n      ipRangeCache.set(botName, { ranges: [] });\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 isIpInRange(ip, range) {\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  return ipv4Regex.test(ip);\n}\n\nfunction validateBotByName(botName, ipAddress) {\n  if (!botName || !ipAddress) {\n    return false;\n  }\n\n  if (!isValidIpAddress(ipAddress)) {\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(ipAddress, range));\n}\n\nexport function validateBot(userAgent, ipAddress) {\n  if (!userAgent || !ipAddress) {\n    return false;\n  }\n\n  const botInfo = detectBot(userAgent);\n  \n  if (!botInfo) {\n    return false;\n  }\n\n  return validateBotByName(botInfo.name, ipAddress);\n}"],"names":["__dirname","fileURLToPath"],"mappings":"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"}