index.js

/* eslint-disable sort-imports */
/**
 * @namespace window
 */
/**
 * @namespace platypus
 */
/* global global, navigator, window */

import AssetManager from './AssetManager.js';
import {Debugger} from 'springroll';
import Game from './Game.js';
import createComponentClass from './factory.js';
import pkg from '../package.json';
import * as components from './components/index.js';

export * from './utils/array.js';
export * from './utils/string.js';
export {default as recycle} from 'recycle';

// Classes
export {default as AABB} from './AABB.js';
export {default as ActionState} from './ActionState.js';
export {Application as Application} from 'springroll';
export {default as CollisionData} from './CollisionData.js';
export {default as CollisionDataContainer} from './CollisionDataContainer.js';
export {default as CollisionShape} from './CollisionShape.js';
export {default as Component} from './Component.js';
export {default as Data} from './Data.js';
export {default as DataMap} from './DataMap.js';
export {default as Entity} from './Entity.js';
export {default as Game} from './Game.js';
export {default as Messenger} from './Messenger.js';
export {default as PIXIAnimation} from './PIXIAnimation.js';
export {default as RandomSet} from './RandomSet.js';
export {default as StateMap} from './StateMap.js';
export {default as Vector} from './Vector.js';
export * from './shapes/index.js';

// Component creator
export {default as createComponentClass} from './factory.js';

const
    platypus = global.platypus = {
        createComponentClass,
        components
    },
    uagent    = navigator.userAgent.toLowerCase(),
    isEdge    = (uagent.search('edge')    > -1),
    isIPod    = (uagent.search('ipod')    > -1),
    isIPhone  = (uagent.search('iphone')  > -1),
    isIPad    = (uagent.search('ipad')    > -1) || (uagent.search('mac') > -1 && navigator.maxTouchPoints > 2 && !isIPhone),
    isAndroid = (uagent.search('android') > -1),
    isSilk    = (uagent.search('silk')    > -1),
    isIOS     = isIPod || isIPhone  || isIPad,
    isMobile  = isIOS  || isAndroid || isSilk,
    logToDiv = isMobile ? (() => {
        const
            logDiv = document.createElement('ul'),
            toggleLogDiv = document.createElement('button');
        let firstTime = true;

        logDiv.style.display = 'none';
        logDiv.id = "platypus-logging";
        logDiv.classList.add('platypus-debugging');
        document.body.appendChild(logDiv);

        toggleLogDiv.style.display = 'none';
        toggleLogDiv.id = 'toggle-platypus-debugging';
        toggleLogDiv.innerText = 'log';
        toggleLogDiv.addEventListener('click', () => {
            if (logDiv.style.display === 'none') {
                logDiv.style.display = 'block';
                toggleLogDiv.innerText = 'X';
            } else {
                logDiv.style.display = 'none';
                toggleLogDiv.innerText = 'log';
            }
        });
        document.body.appendChild(toggleLogDiv);

        return (method, ...args) => {
            const
                newLog = document.createElement('li');

            newLog.classList.add(method);
            args.forEach((arg) => {
                const
                    newArg = document.createElement('span');

                newArg.innerText = arg;
                newLog.appendChild(newArg);
            });

            logDiv.appendChild(newLog);

            if (firstTime) {
                firstTime = false;
                toggleLogDiv.style.display = 'block';
            }
        };
    })() : () => {},
    debugWrapper = function (method, ...args) {
        if (platypus.game?.settings?.debug) {
            Debugger.log(method, ...args);
            logToDiv(method, ...args);
        }
    };

/**
 * This is an object of boolean key/value pairs describing the current browser's properties.
 * @property supports
 * @type Object
 **/
platypus.supports = {
    touch: (window.ontouchstart !== 'undefined'),
    edge: isEdge,
    iPod: isIPod,
    iPhone: isIPhone,
    iPad: isIPad,
    safari: (uagent.search('safari') > -1) && !isEdge,
    ie: (uagent.search('msie') > -1) || (uagent.search('trident') > -1),
    firefox: (uagent.search('firefox') > -1),
    android: isAndroid,
    chrome: (uagent.search('chrome') > -1) && !isEdge,
    silk: isSilk,
    iOS: isIOS,
    mobile: isMobile,
    desktop: !isMobile
};

/**
 * This method defines platypus.debug and uses springroll.Debug if available. If springroll.Debug is not loaded, platypus.debug provides inactive stubs for console methods.
 *
 * @property debug
 * @type Object
 */
platypus.debug = {
    general: debugWrapper.bind(null, 'log'),
    log: debugWrapper.bind(null, 'log'),
    warn: debugWrapper.bind(null, 'warn'),
    debug: debugWrapper.bind(null, 'debug'),
    error: debugWrapper.bind(null, 'error')
};

platypus.assetCache = new AssetManager();

/**
 * The version string for this release.
 * @property version
 * @type String
 * @static
 **/
platypus.version = pkg.version;

platypus.Game = Game;

export {components};
export default platypus;