Source: utility/host.js

'use strict';

/** Utility function for determining brand from the URL
 * @param {string} location - the domain
 * @return {boolean}
 */
function _isGfDomain(location) {
  let isGf = false;
  // An array containing all GF domains
  const gfDomainList = [
    'goldenfrog.com',
    'linkgf.com',
    'goldenfrog.online',
    'goldenfrog.biz',
    'goldenfrog.company',
    'goldenfrog.website',
    'gf-official.com',
    'jinwa-official.com'
  ];

  gfDomainList.forEach((domain) => {
    if (location === domain) {
      isGf = true;
    }
  });

  return isGf;
}

/** Utility function for determining brand from the URL
 * @param {string} location - the domain
 * @return {boolean}
 */
function _isUnbounceDomain(location) {
  // An array containing all GF domains
  const unbounceDomainList = [
    'get.vyprvpn.com',
  ];

  return unbounceDomainList.some(domain => location === domain);
}

/** An object that knows how to interpret the hostname of the current site.
 *
 * We serve our website on multiple domains, and we need to know information
 * about our current host in order to enable/disable certain functionality.
 *
 * @todo Determine whether all properties must have `@type` set
 */
export class Host {

  /** The domain portion of the current location
   * @type {string}
   */
  locationDomain = window.location.hostname.split('.').splice(-2, 2).join('.').toLowerCase();

  /** A boolean indicating if we are on a goldenfrog domain
   */
  isGfDomain = false;

  /** A boolean indicating if we are on a unbounce domain
   */
  isUnbounceDomain = false;

  /** A boolean value indicating we are on a primary domain */
  isPrimaryDomain = false;

  /** A boolean indicating if this is the testing website
   */
  environment = '';

  /** A boolean indicating if this is a development VM
   */
  isDevelopment = false;

  /** A boolean indicating if this is the testing website
   */
  isTesting = false;

  /** A boolean indicating if this is the staging website
   */
  isStaging = false;

  /** A boolean indicating if this is the production website
   */
  isProduction = false;

  /** Site JS element
   * @type {HTMLElement}
   */
  siteJSLoadingElement = null;

  /** Site JS location
   * @type {string}
   */
  siteJSLocation = null;

  /** Set dynamic values for properties */
  constructor() {
    this.isDevelopment = /[0-2]?\d{1,2}\.[0-2]?\d{1,2}\.[0-2]?\d{1,2}\.[0-2]?\d{1,2}/.test(window.location.hostname);
    // Whether `dev#` or `test#` is in the hostname
    this.isTesting = window.location.hostname.includes('test');
    // Whether `staging` is in the hostname
    this.isStaging = window.location.hostname.includes('staging');
    // Whether the hostname is `localhost`; some testing is done in this manner
    this.isLocalhost = (window.location.hostname === 'localhost');

    this.isProduction = !this.isDevelopment && !this.isTesting && !this.isStaging && !this.isLocalhost;

    this.isGfDomain = _isGfDomain(this.locationDomain);

    this.isUnbounceDomain = _isUnbounceDomain(this.locationDomain);

    this.isPrimaryDomain = (this.locationDomain === 'goldenfrog.com')
                          || (this.locationDomain === 'vyprvpn.com');

    if (this.isDevelopment) {
      this.environment = 'development';
    } else if (this.isTesting) {
      this.environment = 'testing';
    } else if (this.isStaging) {
      this.environment = 'staging';
    } else {
      this.environment = 'production';
    }

    this.siteJSLoadingElement = document.currentScript === undefined ?
      document.querySelector('script[src*="gf-site-sync.js"]') : document.currentScript;
    this.siteJSLocation = this.siteJSLoadingElement === null ? '' :
      this.siteJSLoadingElement.getAttribute('src').replace(/gf-site-(sync|onload|legacy)\.js.*/, '');
  }
}

/** Singleton instance */
export const host = new Host();