{"version":3,"file":"browser-dtector.cjs","names":["pkgVersion","browserMatches: BrowserMatches","version","utils"],"sources":["../lib/constants.ts","../lib/utils.ts","../package.json","../lib/browser-dtector.ts"],"sourcesContent":["export const KnownBrowsers = {\n  chrome: 'Google Chrome',\n  brave: 'Brave',\n  crios: 'Google Chrome',\n  edge: 'Microsoft Edge',\n  edg: 'Microsoft Edge',\n  edgios: 'Microsoft Edge',\n  fennec: 'Mozilla Firefox',\n  jsdom: 'JsDOM',\n  mozilla: 'Mozilla Firefox',\n  fxios: 'Mozilla Firefox',\n  msie: 'Microsoft Internet Explorer',\n  opera: 'Opera',\n  opios: 'Opera',\n  opr: 'Opera',\n  opt: 'Opera',\n  rv: 'Microsoft Internet Explorer',\n  safari: 'Safari',\n  samsungbrowser: 'Samsung Browser',\n  electron: 'Electron',\n} as const;\n\nexport const KnownPlatforms = {\n  'android': 'Android',\n  'androidTablet': 'Android Tablet',\n  'cros': 'Chrome OS',\n  'fennec': 'Android Tablet',\n  'ipad': 'IPad',\n  'ipod': 'IPod',\n  'iphone': 'IPhone',\n  'jsdom': 'JsDOM',\n  'linux': 'Linux',\n  'mac': 'Macintosh',\n  'tablet': 'Android Tablet',\n  'win': 'Windows',\n  'windows phone': 'Windows Phone',\n  'xbox': 'Microsoft Xbox',\n} as const;\n","const toFixed = (val: string | number, fixed = -1): string | null => {\n  const REG_EXP = new RegExp(`^-?\\\\d+(?:.\\\\d{0,${fixed}})?`);\n  const match = Number(val).toString().match(REG_EXP);\n  return match ? match[0] : null;\n};\n\nexport default {\n  toFixed,\n};\n","{\n  \"name\": \"browser-dtector\",\n  \"version\": \"4.1.1\",\n  \"description\": \"A Javascript library to detect browser, version and platform\",\n  \"author\": \"sibiraj-s\",\n  \"license\": \"MIT\",\n  \"type\": \"module\",\n  \"repository\": \"github:sibiraj-s/browser-dtector\",\n  \"homepage\": \"https://github.com/sibiraj-s/browser-dtector#readme\",\n  \"bugs\": \"https://github.com/sibiraj-s/browser-dtector/issues\",\n  \"funding\": [\n    {\n      \"type\": \"github\",\n      \"url\": \"https://github.com/sponsors/sibiraj-s\"\n    }\n  ],\n  \"engines\": {\n    \"node\": \">=16\"\n  },\n  \"sideEffects\": false,\n  \"files\": [\n    \"dist\"\n  ],\n  \"main\": \"./dist/browser-dtector.cjs\",\n  \"module\": \"./dist/browser-dtector.mjs\",\n  \"types\": \"./dist/browser-dtector.d.mts\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/browser-dtector.d.cts\",\n        \"default\": \"./dist/browser-dtector.cjs\"\n      },\n      \"import\": {\n        \"types\": \"./dist/browser-dtector.d.mts\",\n        \"default\": \"./dist/browser-dtector.mjs\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"scripts\": {\n    \"build\": \"tsdown\",\n    \"build:docs\": \"vite build --base /browser-dtector/\",\n    \"dev\": \"vite\",\n    \"test\": \"vitest\",\n    \"lint\": \"oxlint .\",\n    \"prepare\": \"is-ci || husky\"\n  },\n  \"keywords\": [\n    \"browser-detector\",\n    \"detect-browser\",\n    \"useragent-parser\",\n    \"ua-parser\"\n  ],\n  \"devDependencies\": {\n    \"@commitlint/cli\": \"^20.1.0\",\n    \"@commitlint/config-conventional\": \"^20.0.0\",\n    \"@fontsource-variable/inconsolata\": \"^5.2.8\",\n    \"@tailwindcss/vite\": \"^4.1.17\",\n    \"@types/react\": \"^19.2.7\",\n    \"@types/react-dom\": \"^19.2.3\",\n    \"happy-dom\": \"^20.0.11\",\n    \"husky\": \"^9.1.7\",\n    \"is-ci\": \"^4.1.0\",\n    \"lint-staged\": \"^16.2.7\",\n    \"oxlint\": \"^1.30.0\",\n    \"postcss\": \"^8.5.6\",\n    \"publint\": \"^0.3.15\",\n    \"react\": \"^19.2.0\",\n    \"react-dom\": \"^19.2.0\",\n    \"react-router-dom\": \"^7.9.6\",\n    \"tailwindcss\": \"^4.1.17\",\n    \"tsdown\": \"^0.17.0-beta.4\",\n    \"typescript\": \"^5.9.3\",\n    \"vite\": \"^7.2.4\",\n    \"vitest\": \"^4.0.14\"\n  }\n}","import { KnownBrowsers, KnownPlatforms } from './constants';\nimport utils from './utils';\n\nimport { version as pkgVersion } from '../package.json';\n\nimport {\n  BrowserMatches,\n  KnownBrowsersKeys,\n  KnownPlatformsKeys,\n  BrowserInfo,\n  NavigatorExtended,\n} from './types';\n\nconst getNavigator = (): NavigatorExtended | null => {\n  if (typeof window !== 'undefined') {\n    return window.navigator as NavigatorExtended;\n  }\n\n  return null;\n};\n\nclass BrowserDetector {\n  userAgent: string | null;\n\n  constructor(inputUA?: string) {\n    this.userAgent = inputUA || getNavigator()?.userAgent || null;\n  }\n\n  static get VERSION(): string {\n    return pkgVersion;\n  }\n\n  parseUserAgent(userAgent?: string) {\n    const browserMatches: BrowserMatches = {} as BrowserMatches;\n\n    const uaFresh = userAgent || this.userAgent || '';\n\n    // convert to lower case and treat tabs and multiple sapces as single space\n    const ua = uaFresh.toLowerCase().replace(/\\s\\s+/g, ' ');\n\n    const browserMatch = (/(edge)\\/([\\w.]+)/).exec(ua)\n      || (/(edg)[/]([\\w.]+)/).exec(ua)\n      || (/(opr)[/]([\\w.]+)/).exec(ua)\n      || (/(opt)[/]([\\w.]+)/).exec(ua)\n      || (/(fxios)[/]([\\w.]+)/).exec(ua)\n      || (/(edgios)[/]([\\w.]+)/).exec(ua)\n      || (/(jsdom)[/]([\\w.]+)/).exec(ua)\n      || (/(samsungbrowser)[/]([\\w.]+)/).exec(ua)\n      || (/(electron)[/]([\\w.]+)/).exec(ua)\n      || (/(chrome)[/]([\\w.]+)/).exec(ua)\n      || (/(crios)[/]([\\w.]+)/).exec(ua)\n      || (/(opios)[/]([\\w.]+)/).exec(ua)\n      || (/(version)(applewebkit)[/]([\\w.]+).*(safari)[/]([\\w.]+)/).exec(ua)\n      || (/(webkit)[/]([\\w.]+).*(version)[/]([\\w.]+).*(safari)[/]([\\w.]+)/).exec(ua)\n      || (/(applewebkit)[/]([\\w.]+).*(safari)[/]([\\w.]+)/).exec(ua)\n      || (/(webkit)[/]([\\w.]+)/).exec(ua)\n      || (/(opera)(?:.*version|)[/]([\\w.]+)/).exec(ua)\n      || (/(msie) ([\\w.]+)/).exec(ua)\n      || (/(fennec)[/]([\\w.]+)/).exec(ua)\n      || (ua.indexOf('trident') >= 0 && (/(rv)(?::| )([\\w.]+)/).exec(ua))\n      || (ua.indexOf('compatible') < 0 && (/(mozilla)(?:.*? rv:([\\w.]+)|)/).exec(ua))\n      || [];\n\n    const platformMatch = (/(ipad)/).exec(ua)\n      || (/(ipod)/).exec(ua)\n      || (/(iphone)/).exec(ua)\n      || (/(jsdom)/).exec(ua)\n      || (/(windows phone)/).exec(ua)\n      || (/(xbox)/).exec(ua)\n      || (/(win)/).exec(ua)\n      || (/(tablet)/).exec(ua)\n      || (((/(android)/).test(ua) && (/(mobile)/).test(ua) === false) && ['androidTablet'])\n      || (/(android)/).exec(ua)\n      || (/(mac)/).exec(ua)\n      || (/(linux)/).exec(ua)\n      || (/(cros)/).exec(ua)\n      || [];\n\n    let name = browserMatch[5] || browserMatch[3] || browserMatch[1] || null;\n    const platform = platformMatch[0] || null;\n    const version = browserMatch[4] || browserMatch[2] || null;\n\n    // brave browser doesn't expose itslef via useragent\n    // but as chrome browser\n    const navigator = getNavigator();\n    if (\n      name === 'chrome'\n      && typeof navigator?.brave?.isBrave === 'function'\n    ) {\n      name = 'brave';\n    }\n\n    if (name) {\n      browserMatches[name as KnownBrowsersKeys] = true;\n    }\n    if (platform) {\n      browserMatches[platform as KnownPlatformsKeys] = true;\n    }\n\n    const isAndroid = Boolean(browserMatches.tablet\n      || browserMatches.android\n      || browserMatches.androidTablet);\n\n    const isTablet = Boolean(browserMatches.ipad\n      || browserMatches.tablet\n      || browserMatches.androidTablet);\n\n    const isMobile = Boolean(browserMatches.android\n      || browserMatches.androidTablet\n      || browserMatches.tablet\n      || browserMatches.ipad\n      || browserMatches.ipod\n      || browserMatches.iphone\n      || browserMatches['windows phone']);\n\n    const isDesktop = Boolean(browserMatches.cros\n      || browserMatches.mac\n      || browserMatches.linux\n      || browserMatches.win);\n\n    const isWebkit = Boolean(browserMatches.brave\n      || browserMatches.chrome\n      || browserMatches.crios\n      || browserMatches.opr\n      || browserMatches.safari\n      || browserMatches.edg\n      || browserMatches.electron);\n\n    const isIE = Boolean(browserMatches.msie\n      || browserMatches.rv);\n\n    const isChrome = Boolean(browserMatches.chrome\n      || browserMatches.crios);\n\n    const isFireFox = Boolean(browserMatches.fxios\n      || browserMatches.fennec\n      || browserMatches.mozilla);\n\n    const isSafari = Boolean(browserMatches.safari);\n\n    const isOpera = Boolean(browserMatches.opera\n      || browserMatches.opios\n      || browserMatches.opr\n      || browserMatches.opt);\n\n    const isEdge = Boolean(browserMatches.edg\n      || browserMatches.edge\n      || browserMatches.edgios);\n\n    const browserInfo: BrowserInfo = {\n      name: (name ? KnownBrowsers[name as KnownBrowsersKeys] : null) ?? null,\n      platform: (platform ? KnownPlatforms[platform as KnownPlatformsKeys] : null) ?? null,\n      userAgent: uaFresh,\n      version,\n      shortVersion: version ? utils.toFixed(parseFloat(version), 2) : null,\n      isAndroid,\n      isTablet,\n      isMobile,\n      isDesktop,\n      isWebkit,\n      isIE,\n      isChrome,\n      isFireFox,\n      isSafari,\n      isOpera,\n      isEdge,\n    };\n\n    return browserInfo;\n  }\n\n  getBrowserInfo() {\n    const browserInfo = this.parseUserAgent();\n\n    return {\n      name: browserInfo.name,\n      platform: browserInfo.platform,\n      userAgent: browserInfo.userAgent,\n      version: browserInfo.version,\n      shortVersion: browserInfo.shortVersion,\n    };\n  }\n}\n\nexport { KnownBrowsers, KnownPlatforms, BrowserDetector };\nexport default BrowserDetector;\n"],"mappings":"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"}