Source: jquery/contextMenuFunction.js

/**
 * The jQuery plugin namespace.
 * @external "jQuery.fn"
 * @see {@link http://docs.jquery.com/Plugins/Authoring The jQuery Plugin Guide}
 */

/**
 * Function that is called when calling contextmenu on an element (eg. $('.contextmenu').contextMenu()).
 *
 * @instance
 * @function external:jQuery.fn.contextmenu
 *
 * @param {(string|Object)} operation
 * @returns {JQuery}
 */
export default function (operation) {
    const $t = this;
    const $o = operation;
    if ($t.length > 0) { // this is not a build on demand menu
        if (typeof operation === 'undefined') {
            $t.first().trigger('contextmenu');
        } else if (typeof operation.x !== 'undefined' && typeof operation.y !== 'undefined') {
            $t.first().trigger($.Event('contextmenu', {
                pageX: operation.x,
                pageY: operation.y,
                mouseButton: operation.button
            }));
        } else if (operation === 'hide') {
            const $menu = this.first().data('contextMenu') ? this.first().data('contextMenu').$menu : null;
            if ($menu) {
                $menu.trigger('contextmenu:hide');
            }
        } else if (operation === 'destroy') {
            $.contextMenu('destroy', {context: this});
        } else if (operation === 'update') {
            $.contextMenu('update', {context: this});
        } else if ($.isPlainObject(operation)) {
            operation.context = this;
            $.contextMenu('create', operation);
        } else if (operation === true) {
            $t.removeClass('context-menu-disabled');
        } else if (operation === false) {
            $t.addClass('context-menu-disabled');
        }
    } else {
        // eslint-disable-next-line no-undef
        $.each($.contextMenu.menus, function () {
            if (this.selector === $t.selector) {
                $o.data = this;

                $.extend($o.data, {trigger: 'demand'});
            }
        });

        $.contextMenu.handle.contextmenu.call($o.target, $o);
    }

    return this;
}