pure-js/browser-detection

View on GitHub
src/browser-detection.ts

Summary

Maintainability
C
7 hrs
Test Coverage
import { detectBrowserVersion } from './detect-browser-version';
/**
 * Detects Chrome browser
 */
function isChrome(userAgent: string): boolean {
  return (
    userAgent.includes('Chrome') &&
    !userAgent.includes('Chromium') &&
    !userAgent.includes('SamsungBrowser') &&
    !userAgent.includes('OPR') &&
    !userAgent.includes('MQQBrowser') &&
    !userAgent.includes('Edge')
  );
}

/**
 * Detects Safari browser
 */
function isSafari(userAgent: string): boolean {
  return (
    userAgent.includes('Safari') &&
    !userAgent.includes('Chrome') &&
    !userAgent.includes('Chromium') &&
    !userAgent.includes('Android')
  );
}

/**
 * Detects Samsung browser
 */
function isSamsungInternet(userAgent: string): boolean {
  return userAgent.includes('SamsungBrowser');
}

/**
 * Detects Opera browser
 */
function isOpera(userAgent: string): boolean {
  return userAgent.includes('OPR');
}

/**
 * Detects UC browser
 */
function isUcBrowser(userAgent: string): boolean {
  return userAgent.includes('UCBrowser');
}

/**
 * Detects Android browser
 */
function isAndroidBrowser(userAgent: string): boolean {
  return (
    userAgent.includes('Android') &&
    !userAgent.includes('Chrome') &&
    userAgent.includes('AppleWebKit')
  );
}

/**
 * Detects Firefox browser
 */
function isFirefox(userAgent: string): boolean {
  return userAgent.includes('Firefox') && !userAgent.includes('Seamonkey');
}

/**
 * Detects QQ browser
 */
function isQqBrowser(userAgent: string): boolean {
  return userAgent.includes('MQQBrowser');
}

/**
 * Detects IE browser
 */
function isIe(userAgent: string): boolean {
  return /trident/i.test(userAgent);
}

export type BrowserName =
  | 'Chrome'
  | 'Safari'
  | 'Samsung Internet'
  | 'Opera'
  | 'UC Browser'
  | 'Android Browser'
  | 'Firefox'
  | 'QQ Browser'
  | 'Edge'
  | 'IE';

/**
 * Detects Edge browser
 */
function isEdge(userAgent: string): boolean {
  return userAgent.includes('Edge') && userAgent.includes('Chrome');
}

/**
 * Detects browser name
 */
function detectBrowserName(userAgent: string): BrowserName | undefined {
  if (isChrome(userAgent)) {
    return 'Chrome';
  }

  if (isSafari(userAgent)) {
    return 'Safari';
  }

  if (isSamsungInternet(userAgent)) {
    return 'Samsung Internet';
  }

  if (isOpera(userAgent)) {
    return 'Opera';
  }

  if (isUcBrowser(userAgent)) {
    return 'UC Browser';
  }

  if (isAndroidBrowser(userAgent)) {
    return 'Android Browser';
  }

  if (isFirefox(userAgent)) {
    return 'Firefox';
  }

  if (isQqBrowser(userAgent)) {
    return 'QQ Browser';
  }

  if (isEdge(userAgent)) {
    return 'Edge';
  }

  if (isIe(userAgent)) {
    return 'IE';
  }

  return undefined;
}

export type UaBrowserName =
  | 'SamsungBrowser'
  | 'OPR'
  | 'UCBrowser'
  | 'MQQBrowser';

/**
 * Returns Association
 */
export function getBrowserUaName(
  name: BrowserName | undefined,
): UaBrowserName | undefined {
  if (name) {
    switch (name) {
      case 'Opera':
        return 'OPR';
      case 'UC Browser':
        return 'UCBrowser';
      case 'Samsung Internet':
        return 'SamsungBrowser';
      case 'QQ Browser':
        return 'MQQBrowser';
      default:
        return undefined;
    }
  }
}

/**
 * Detects browser name & version
 */
function detectBrowserNameAndVersion(nav: { userAgent: string }): {
  name: BrowserName | undefined;
  version: number | undefined;
} {
  const name = detectBrowserName(nav.userAgent);

  return {
    name,
    version: detectBrowserVersion(nav, name),
  };
}

const detectBrowser = detectBrowserNameAndVersion;

export {
  detectBrowserName,
  detectBrowserVersion,
  detectBrowserNameAndVersion,
  detectBrowser,
};