JSFiddle - React, Tailwind, and code Playground

by evgkch

Babel + JSX

/**
 * <EventEmitter> is a light version of the Nodejs' EventEmitter
 * to use it independent from platrform.
 * https://nodejs.org/dist/latest-v12.x/docs/api/events.html
 */
class EventEmitter {
    constructor() {
        /**
         * Alias of 'addListener' method
         */
        this.on = this.addListener;
        /**
         * Alias of 'removeListener' method
         */
        this.off = this.removeListener;
        this.listeners = {};
    }
    /**
     * Add event listener
     */
    addListener(eventName, listener) {
        const listeners = this.listeners[eventName];
        if (listeners) {
            listeners.push(listener);
        }
        else {
            this.listeners[eventName] = [listener];
        }
        return this;
    }
    /**
     * Remove event listener
     */
    removeListener(eventName, listener) {
        const listeners = this.listeners[eventName];
        if (listeners) {
            const start = listeners.indexOf(listener);
            if (start > -1) {
                listeners.splice(start, 1);
            }
        }
        return this;
    }
    /**
     * Removes all listeners, or those of the specified eventName
     */
    removeAllListeners(eventName) {
        delete this.listeners[eventName];
    }
    /**
     * Call listener once, removed after call
     */
    once(eventName, listener) {
        const cb = (...args) => {
            listener(...args);
            setTimeout(() => {
            	this.removeListener(eventName, cb);
            }, 0);
        };
        this.addListener(eventName, cb);
        return this;
    }
    /**
     * Adds the listener function to the beginning of the listeners array for the event named eventName
     */
    prependListener(eventName, listener) {
        const listeners = this.listeners[eventName];
        if (listeners) {
            listeners.unshift(listener);
        }
        else {
            this.listeners[eventName] = [listener];
        }
       ...