assertions/envs.js

/**
 * @fileOverview Environments checks.
 * @module Envs
 */

const Helpers = require('../helpers');
const Mixed = require('./mixed');
const Interface = require('../interface');
let Envs = {};

/**
 * Check if server environment
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name commonjsEnv
 * @returns {boolean}
 * @example
 * be.commonjsEnv() // true
 */
Envs.commonjsEnv = () => {
    return typeof process !== 'undefined';
};

Envs.commonjsEnv.multiple = false;

/**
 * Check if browser environment
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name browserEnv
 * @returns {boolean}
 * @example
 * be.browserEnv() // true
 */
Envs.browserEnv = () => {
    return typeof window !== 'undefined';
};

Envs.browserEnv.multiple = false;

/**
 * Check if AMD environment
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name amdEnv
 * @returns {boolean}
 * @example
 * be.amdEnv() // true
 */
Envs.amdEnv = () => {
    return typeof define === 'function' && define.amd;
};

Envs.amdEnv.multiple = false;

/**
 * Check if exists navigator object
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name navigator
 * @returns {boolean}
 * @example
 * be.navigator() // true
 */
Envs.navigator = () => {
    return Envs.browserEnv() && typeof window.navigator !== 'undefined';
};

Envs.navigator.multiple = false;


/**
 * Check if is on line
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name online
 * @returns {boolean}
 * @example
 * be.onLine() // true
 */
Envs.onLine = function () {
    return Envs.navigator() && navigator.onLine;
};

Envs.onLine.multiple = false;

let regExp = {
    android: /^(?:(?!Windows).)*(Android)(?:\s)(\d+((\.\d+)+)?)?/,
    androidTablet: /(Android)(?:\s)(\d+((\.\d+)+)?)?(?!.*Mobile)/,
    androidPhone: /(Android)(?:\s)(\d+((\.\d+)+)?)?(?:.*Mobile)/,
    chrome: /(Chrome|Crios)\/(\d+((\.\d+)+)?)?\s+(Safari)\/(\d+((\.\d+)+)?)?$/,
    chromeIOS: /(CriOS)\/(\d+((\.\d+)+)?)?/,
    opera: /(Opera|OPR)(?:[\/\s])(\d+((\.\d+)+)?)?/,
    firefox: /(Firefox)\/(\d+((\.\d+)+)?)?$/,
    edge: /(Edge)\/(\d+((\.\d+)+)?)?$/,
    safari: /^(?:(?!Chrome).)*(Safari)\/(\d+((\.\d+)+)?)?/,
    safariMobile: /^(?:(?!CriOS).)*(?:Mobile\/.*)(Safari)\/(\d+((\.\d+)+)?)?/,
    ie: /(MSIE|rv)(?:[\s:])(\d+((\.\d+)+)?)?/,
    windowsPhone: /(Windows Phone)(?:\s)(\d+((\.\d+)+)?)?/,
    windowsTablet: /(Windows NT)(?:\s)(\d+((\.\d+)+)?)?(?:.*Touch)/,
    blackberry: /BlackBerry|BB10/,
    iphone: /iPhone/,
    ipad: /iPad/,
    ipod: /iPod/,
    ios: /iPhone|iPad|iPod/,
    mac: /Mac/,
    linux: /Linux/,
    windows: /Windows/,
};

for(let i in regExp){
    Envs[i] = (range, agent) => {
        let rangePart = Helpers.operatorVersion(range);
        agent = !rangePart && !agent && range ? range : agent || navigator.userAgent;
        let match = agent.match(regExp[i]);
        if(rangePart && match && match[2]){
            return Mixed.compareVersion(match[2], rangePart[0], rangePart[1], true);
        }
        return match !== null;
    };
    Envs[i].multiple = false;
}

/**
 * Check if is mobile device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name mobile
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.mobile() // true
 */
Envs.mobile = (agent) => {
    agent = agent || navigator.userAgent;
    return Envs.iphone(agent) || Envs.ipod(agent) || Envs.androidPhone(agent) || Envs.blackberry(agent) || Envs.windowsPhone(agent);
};

/**
 * Check if is tablet device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name tablet
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.tablet() // true
 */
Envs.tablet = (agent) => {
    agent = agent || navigator.userAgent;
    return Envs.ipad(agent) || Envs.windowsTablet(agent) || Envs.androidTablet(agent);
};

/**
 * Check if is desktop device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name desktop
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.desktop() // true
 */
Envs.desktop = (agent) => {
    agent = agent || navigator.userAgent;
    return Envs.not.tablet(agent) && Envs.not.mobile(agent);
};

/**
 * Check if is Android tablet
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name androidTablet
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.androidTablet() // true
 */

/**
 * Check if is Android phone
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name androidPhone
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.androidPhone() // true
 */

/**
 * Check if is Windows Phone
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name windowsPhone
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.windowsPhone() // true
 */

/**
 * Check if is Windows Tablet
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name windowsTablet
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.windowsTablet() // true
 */

/**
 * Check if is BlackBerry device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name blackberry
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.blackberry() // true
 */

/**
 * Check if is iOS device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name ios
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.ios() // true
 */

/**
 * Check if is iPad device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name ipad
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.ipad() // true
 */

/**
 * Check if is iPod device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name ipod
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.ipod() // true
 */

/**
 * Check if is iPhone device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name iphone
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.iphone() // true
 */

/**
 * Check if is Android device
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name android
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.android() // true
 * be.android('==4') // true
 */

/**
 * Firefox detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name firefox
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.firefox() // true
 * be.firefox('==30') // true
 */

/**
 * Chrome detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name chrome
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.chrome() // true
 * be.chrome('==59') // true
 */

/**
 * Chrome iOS detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name chromeIOS
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.chromeIOS() // true
 * be.chromeIOS('==59') // true
 */

/**
 * Safari detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name safari
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.safari() // true
 * be.safari('<=7') // true
 */

/**
 * Safari mobile detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name safariMobile
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.safariMobile() // true
 * be.safariMobile('<=7') // true
 */

/**
 * Edge detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name edge
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.edge() // true
 * be.edge('>=12') // true
 */

/**
 * Explorer detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name ie
 * @param range {string} operator and version number "==", "<", "<=", ">", "=>" ex: >=4
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.ie() // true
 * be.ie('==9') // true
 */

/**
 * Mac detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name mac
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.mac() // true
 */

/**
 * Windows detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name windows
 * @param agent {string} user agent string
 * @returns {boolean}
 * @example
 * be.windows() // true
 */

/**
 * Linux detecting
 *
 * **Interfaces**: `not`, `err`
 *
 * @function
 * @name linux
 * @param agent {string} user agent string
 * @returns {boolean}
 * @since 1.6.0
 * @example
 * be.linux() // true
 */

Envs = Interface.create(Envs);

module.exports = Envs;