Browse Source

Replace lodash methods with built-ins, convert docstrings to JSDoc

JC Brand 5 years ago
parent
commit
768ed4a577

+ 1 - 1
src/converse-minimize.js

@@ -496,7 +496,7 @@ converse.plugins.add('converse-minimize', {
             },
             },
 
 
             addMultipleChats (items) {
             addMultipleChats (items) {
-                _.each(items, this.addChatView.bind(this));
+                items.forEach(item => this.addChatView(item));
                 this.toggleview.model.set({'num_minimized': this.keys().length});
                 this.toggleview.model.set({'num_minimized': this.keys().length});
                 this.render();
                 this.render();
             },
             },

+ 11 - 7
src/converse-muc-views.js

@@ -192,10 +192,14 @@ converse.plugins.add('converse-muc-views', {
                 }));
                 }));
         }
         }
 
 
+        /**
+         * Show/hide extra information about a groupchat in a listing.
+         * @function toggleRoomInfo
+         * @param { Event }
+         */
         function toggleRoomInfo (ev) {
         function toggleRoomInfo (ev) {
-            /* Show/hide extra information about a groupchat in a listing. */
-            const parent_el = u.ancestor(ev.target, '.room-item'),
-                  div_el = parent_el.querySelector('div.room-info');
+            const parent_el = u.ancestor(ev.target, '.room-item');
+            const div_el = parent_el.querySelector('div.room-info');
             if (div_el) {
             if (div_el) {
                 u.slideIn(div_el).then(u.removeElement)
                 u.slideIn(div_el).then(u.removeElement)
                 parent_el.querySelector('a.room-info').classList.remove('selected');
                 parent_el.querySelector('a.room-info').classList.remove('selected');
@@ -203,7 +207,7 @@ converse.plugins.add('converse-muc-views', {
                 parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
                 parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
                 _converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null)
                 _converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null)
                     .then(stanza => insertRoomInfo(parent_el, stanza))
                     .then(stanza => insertRoomInfo(parent_el, stanza))
-                    .catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
+                    .catch(e => _converse.log(e, Strophe.LogLevel.ERROR));
             }
             }
         }
         }
 
 
@@ -1312,7 +1316,7 @@ converse.plugins.add('converse-muc-views', {
                     this.showSpinner();
                     this.showSpinner();
                     this.model.fetchRoomConfiguration()
                     this.model.fetchRoomConfiguration()
                         .then(iq => this.renderConfigurationForm(iq))
                         .then(iq => this.renderConfigurationForm(iq))
-                        .catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
+                        .catch(e => _converse.log(e, Strophe.LogLevel.ERROR));
                 } else {
                 } else {
                     this.closeForm();
                     this.closeForm();
                 }
                 }
@@ -2072,7 +2076,7 @@ converse.plugins.add('converse-muc-views', {
                 // Features could have been added before the controlbox was
                 // Features could have been added before the controlbox was
                 // initialized. We're only interested in MUC
                 // initialized. We're only interested in MUC
                 _converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC })));
                 _converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC })));
-            }).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
+            }).catch(e => _converse.log(e, Strophe.LogLevel.ERROR));
         }
         }
 
 
         function fetchAndSetMUCDomain (controlboxview) {
         function fetchAndSetMUCDomain (controlboxview) {
@@ -2124,7 +2128,7 @@ converse.plugins.add('converse-muc-views', {
                 return;
                 return;
             }
             }
             fetchAndSetMUCDomain(view);
             fetchAndSetMUCDomain(view);
-            view.model.on('change:connected', _.partial(fetchAndSetMUCDomain, view));
+            view.model.on('change:connected', () => fetchAndSetMUCDomain(view));
         });
         });
         /************************ END Event Handlers ************************/
         /************************ END Event Handlers ************************/
 
 

+ 1 - 1
src/converse-oauth.js

@@ -81,7 +81,7 @@ converse.plugins.add("converse-oauth", {
             'sync': function sync () {},
             'sync': function sync () {},
 
 
             initialize () {
             initialize () {
-                _.each(_converse.user_settings.oauth_providers, (provider) => {
+                _converse.user_settings.oauth_providers.forEach(provider => {
                     const item = new Backbone.Model(Object.assign(provider, {
                     const item = new Backbone.Model(Object.assign(provider, {
                         'login_text': __('Log in with %1$s', provider.name)
                         'login_text': __('Log in with %1$s', provider.name)
                     }));
                     }));

+ 4 - 4
src/converse-omemo.js

@@ -1022,8 +1022,8 @@ converse.plugins.add('converse-omemo', {
                 if (this._devices_promise === undefined) {
                 if (this._devices_promise === undefined) {
                     this._devices_promise = new Promise(resolve => {
                     this._devices_promise = new Promise(resolve => {
                         this.devices.fetch({
                         this.devices.fetch({
-                            'success': _.flow(c => this.onDevicesFound(c), resolve),
-                            'error': _.flow(_.partial(_converse.log, _, Strophe.LogLevel.ERROR), resolve)
+                            'success': c => resolve(this.onDevicesFound(c)),
+                            'error': e => { _converse.log(e, Strophe.LogLevel.ERROR); resolve(); }
                         });
                         });
                     });
                     });
                 }
                 }
@@ -1265,11 +1265,11 @@ converse.plugins.add('converse-omemo', {
 
 
         _converse.api.listen.on('userDetailsModalInitialized', (contact) => {
         _converse.api.listen.on('userDetailsModalInitialized', (contact) => {
             const jid = contact.get('jid');
             const jid = contact.get('jid');
-            _converse.generateFingerprints(jid).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
+            _converse.generateFingerprints(jid).catch(e => _converse.log(e, Strophe.LogLevel.ERROR));
         });
         });
 
 
         _converse.api.listen.on('profileModalInitialized', (contact) => {
         _converse.api.listen.on('profileModalInitialized', (contact) => {
-            _converse.generateFingerprints(_converse.bare_jid).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
+            _converse.generateFingerprints(_converse.bare_jid).catch(e => _converse.log(e, Strophe.LogLevel.ERROR));
         });
         });
 
 
         _converse.api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
         _converse.api.listen.on('afterTearDown', () => (delete _converse.omemo_store));

+ 3 - 3
src/converse-register.js

@@ -142,10 +142,10 @@ converse.plugins.add('converse-register', {
             _converse.api.waitUntil('controlBoxInitialized').then(() => {
             _converse.api.waitUntil('controlBoxInitialized').then(() => {
                 const controlbox = _converse.chatboxes.get('controlbox')
                 const controlbox = _converse.chatboxes.get('controlbox')
                 controlbox.set({'active-form': value});
                 controlbox.set({'active-form': value});
-            }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+            }).catch(e => _converse.log(e, Strophe.LogLevel.FATAL));
         }
         }
-        _converse.router.route('converse/login', _.partial(setActiveForm, 'login'));
-        _converse.router.route('converse/register', _.partial(setActiveForm, 'register'));
+        _converse.router.route('converse/login', () => setActiveForm('login'));
+        _converse.router.route('converse/register', () => setActiveForm('register'));
 
 
 
 
         _converse.RegisterLinkView = Backbone.VDOMView.extend({
         _converse.RegisterLinkView = Backbone.VDOMView.extend({

+ 27 - 20
src/converse-rosterview.js

@@ -536,6 +536,11 @@ converse.plugins.add('converse-rosterview', {
             }
             }
         });
         });
 
 
+        /**
+         * @class
+         * @namespace _converse.RosterGroupView
+         * @memberOf _converse
+         */
         _converse.RosterGroupView = OrderedListView.extend({
         _converse.RosterGroupView = OrderedListView.extend({
             tagName: 'div',
             tagName: 'div',
             className: 'roster-group hidden',
             className: 'roster-group hidden',
@@ -655,6 +660,7 @@ converse.plugins.add('converse-rosterview', {
              * If all contacts are filtered out (i.e. hidden), then the
              * If all contacts are filtered out (i.e. hidden), then the
              * group must be filtered out as well.
              * group must be filtered out as well.
              * @private
              * @private
+             * @method _converse.RosterGroupView#filter
              * @param { string } q - The query to filter against
              * @param { string } q - The query to filter against
              * @param { string } type
              * @param { string } type
              */
              */
@@ -728,6 +734,11 @@ converse.plugins.add('converse-rosterview', {
         });
         });
 
 
 
 
+        /**
+         * @class
+         * @namespace _converse.RosterView
+         * @memberOf _converse
+         */
         _converse.RosterView = OrderedListView.extend({
         _converse.RosterView = OrderedListView.extend({
             tagName: 'div',
             tagName: 'div',
             id: 'converse-roster',
             id: 'converse-roster',
@@ -830,27 +841,21 @@ converse.plugins.add('converse-rosterview', {
             },
             },
 
 
             filter (query, type) {
             filter (query, type) {
-                // First we make sure the filter is restored to its
-                // original state
-                _.each(this.getAll(), function (view) {
-                    if (view.model.contacts.length > 0) {
-                        view.show().filter('');
-                    }
-                });
+                const views = Object.values(this.getAll());
+                // First ensure the filter is restored to its original state
+                views.forEach(v => (v.model.contacts.length > 0) && v.show().filter(''));
                 // Now we can filter
                 // Now we can filter
                 query = query.toLowerCase();
                 query = query.toLowerCase();
                 if (type === 'groups') {
                 if (type === 'groups') {
-                    _.each(this.getAll(), function (view, idx) {
-                        if (!_.includes(view.model.get('name').toLowerCase(), query.toLowerCase())) {
+                    views.forEach(view => {
+                        if (!view.model.get('name').toLowerCase().includes(query)) {
                             u.slideIn(view.el);
                             u.slideIn(view.el);
                         } else if (view.model.contacts.length > 0) {
                         } else if (view.model.contacts.length > 0) {
                             u.slideOut(view.el);
                             u.slideOut(view.el);
                         }
                         }
                     });
                     });
                 } else {
                 } else {
-                    _.each(this.getAll(), function (view) {
-                        view.filter(query, type);
-                    });
+                    views.forEach(v => v.filter(query, type));
                 }
                 }
             },
             },
 
 
@@ -893,10 +898,14 @@ converse.plugins.add('converse-rosterview', {
                 this.updateFilter();
                 this.updateFilter();
             },
             },
 
 
+            /**
+             * Returns the group as specified by name.
+             * Creates the group if it doesn't exist.
+             * @method _converse.RosterView#getGroup
+             * @private
+             * @param {string} name
+             */
             getGroup (name) {
             getGroup (name) {
-                /* Returns the group as specified by name.
-                 * Creates the group if it doesn't exist.
-                 */
                 const view =  this.get(name);
                 const view =  this.get(name);
                 if (view) {
                 if (view) {
                     return view.model;
                     return view.model;
@@ -913,13 +922,11 @@ converse.plugins.add('converse-rosterview', {
                 let groups;
                 let groups;
                 if (_converse.roster_groups) {
                 if (_converse.roster_groups) {
                     groups = contact.get('groups');
                     groups = contact.get('groups');
-                    if (groups.length === 0) {
-                        groups = [_converse.HEADER_UNGROUPED];
-                    }
+                    groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups;
                 } else {
                 } else {
                     groups = [_converse.HEADER_CURRENT_CONTACTS];
                     groups = [_converse.HEADER_CURRENT_CONTACTS];
                 }
                 }
-                _.each(groups, _.bind(this.addContactToGroup, this, contact, _, options));
+                groups.forEach(g => this.addContactToGroup(contact, g, options));
             },
             },
 
 
             addRosterContact (contact, options) {
             addRosterContact (contact, options) {
@@ -965,7 +972,7 @@ converse.plugins.add('converse-rosterview', {
                 /* Place the rosterview inside the "Contacts" panel. */
                 /* Place the rosterview inside the "Contacts" panel. */
                 _converse.api.waitUntil('rosterViewInitialized')
                 _converse.api.waitUntil('rosterViewInitialized')
                     .then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el))
                     .then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el))
-                    .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+                    .catch(e => _converse.log(e, Strophe.LogLevel.FATAL));
             }
             }
             insertRoster();
             insertRoster();
             view.model.on('change:connected', insertRoster);
             view.model.on('change:connected', insertRoster);

+ 1 - 1
src/headless/converse-bookmarks.js

@@ -290,7 +290,7 @@ converse.plugins.add('converse-bookmarks', {
                 if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) {
                 if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) {
                     _converse.api.waitUntil('bookmarksInitialized')
                     _converse.api.waitUntil('bookmarksInitialized')
                         .then(() => _converse.bookmarks.createBookmarksFromStanza(message))
                         .then(() => _converse.bookmarks.createBookmarksFromStanza(message))
-                        .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+                        .catch(e => _converse.log(e, Strophe.LogLevel.FATAL));
                 }
                 }
             }, null, 'message', 'headline', null, _converse.bare_jid);
             }, null, 'message', 'headline', null, _converse.bare_jid);
 
 

+ 1 - 1
src/headless/converse-chatboxes.js

@@ -1461,7 +1461,7 @@ converse.plugins.add('converse-chatboxes', {
                     } else if (_.isString(jids)) {
                     } else if (_.isString(jids)) {
                         return _converse.chatboxes.getChatBox(jids);
                         return _converse.chatboxes.getChatBox(jids);
                     }
                     }
-                    return jids.map(_.partial(_converse.chatboxes.getChatBox.bind(_converse.chatboxes), _, {}, true));
+                    return jids.map(jid => _converse.chatboxes.getChatBox(jid, {}, true));
                 }
                 }
             }
             }
         });
         });

+ 2 - 2
src/headless/converse-core.js

@@ -1127,8 +1127,8 @@ _converse.initialize = async function (settings, callback) {
             _converse.xmppstatus = new this.XMPPStatus({'id': id});
             _converse.xmppstatus = new this.XMPPStatus({'id': id});
             _converse.xmppstatus.browserStorage = new BrowserStorage.session(id);
             _converse.xmppstatus.browserStorage = new BrowserStorage.session(id);
             _converse.xmppstatus.fetch({
             _converse.xmppstatus.fetch({
-                'success': _.partial(_converse.onStatusInitialized, reconnecting),
-                'error': _.partial(_converse.onStatusInitialized, reconnecting),
+                'success': () => _converse.onStatusInitialized(reconnecting),
+                'error': () => _converse.onStatusInitialized(reconnecting),
                 'silent': true
                 'silent': true
             });
             });
         }
         }

+ 7 - 9
src/headless/converse-disco.js

@@ -154,9 +154,9 @@ converse.plugins.add('converse-disco', {
             },
             },
 
 
             onDiscoItems (stanza) {
             onDiscoItems (stanza) {
-                _.each(sizzle(`query[xmlns="${Strophe.NS.DISCO_ITEMS}"] item`, stanza), (item) => {
+                sizzle(`query[xmlns="${Strophe.NS.DISCO_ITEMS}"] item`, stanza).forEach(item => {
                     if (item.getAttribute("node")) {
                     if (item.getAttribute("node")) {
-                        // XXX: ignore nodes for now.
+                        // XXX: Ignore nodes for now.
                         // See: https://xmpp.org/extensions/xep-0030.html#items-nodes
                         // See: https://xmpp.org/extensions/xep-0030.html#items-nodes
                         return;
                         return;
                     }
                     }
@@ -191,9 +191,9 @@ converse.plugins.add('converse-disco', {
                     });
                     });
                 });
                 });
 
 
-                _.each(sizzle(`x[type="result"][xmlns="${Strophe.NS.XFORM}"]`, stanza), (form) => {
+                sizzle(`x[type="result"][xmlns="${Strophe.NS.XFORM}"]`, stanza).forEach(form => {
                     const data = {};
                     const data = {};
-                    _.each(form.querySelectorAll('field'), (field) => {
+                    sizzle('field', form).forEach(field => {
                         data[field.getAttribute('var')] = {
                         data[field.getAttribute('var')] = {
                             'value': _.get(field.querySelector('value'), 'textContent'),
                             'value': _.get(field.querySelector('value'), 'textContent'),
                             'type': field.getAttribute('type')
                             'type': field.getAttribute('type')
@@ -308,7 +308,7 @@ converse.plugins.add('converse-disco', {
                 iqresult.attrs({'to': from});
                 iqresult.attrs({'to': from});
             }
             }
             iqresult.c('query', attrs);
             iqresult.c('query', attrs);
-            _.each(plugin._identities, (identity) => {
+            plugin._identities.forEach(identity => {
                 const attrs = {
                 const attrs = {
                     'category': identity.category,
                     'category': identity.category,
                     'type': identity.type
                     'type': identity.type
@@ -321,9 +321,7 @@ converse.plugins.add('converse-disco', {
                 }
                 }
                 iqresult.c('identity', attrs).up();
                 iqresult.c('identity', attrs).up();
             });
             });
-            _.each(plugin._features, (feature) => {
-                iqresult.c('feature', {'var': feature}).up();
-            });
+            plugin._features(feature => iqresult.c('feature', {'var': feature}).up());
             _converse.api.send(iqresult.tree());
             _converse.api.send(iqresult.tree());
             return true;
             return true;
         }
         }
@@ -771,7 +769,7 @@ converse.plugins.add('converse-disco', {
                  *             // The entity DOES NOT have this identity
                  *             // The entity DOES NOT have this identity
                  *         }
                  *         }
                  *     }
                  *     }
-                 * ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+                 * ).catch(e => _converse.log(e, Strophe.LogLevel.FATAL));
                  */
                  */
                 async getIdentity (category, type, jid) {
                 async getIdentity (category, type, jid) {
                     const e = await _converse.api.disco.entities.get(jid, true);
                     const e = await _converse.api.disco.entities.get(jid, true);

+ 11 - 11
src/headless/converse-muc.js

@@ -486,7 +486,7 @@ converse.plugins.add('converse-muc', {
                 const storage = _converse.config.get('storage');
                 const storage = _converse.config.get('storage');
                 const id = `converse.muc-features-${_converse.bare_jid}-${this.get('jid')}`;
                 const id = `converse.muc-features-${_converse.bare_jid}-${this.get('jid')}`;
                 this.features = new Backbone.Model(
                 this.features = new Backbone.Model(
-                    _.assign({id}, _.zipObject(converse.ROOM_FEATURES, _.map(converse.ROOM_FEATURES, _.stubFalse)))
+                    _.assign({id}, _.zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(_.stubFalse)))
                 );
                 );
                 this.features.browserStorage = new BrowserStorage.session(id);
                 this.features.browserStorage = new BrowserStorage.session(id);
             },
             },
@@ -848,7 +848,7 @@ converse.plugins.add('converse-muc', {
 
 
                 const features = await _converse.api.disco.getFeatures(this.get('jid'));
                 const features = await _converse.api.disco.getFeatures(this.get('jid'));
                 const attrs = Object.assign(
                 const attrs = Object.assign(
-                    _.zipObject(converse.ROOM_FEATURES, _.map(converse.ROOM_FEATURES, _.stubFalse)),
+                    _.zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(_.stubFalse)),
                     {'fetched': (new Date()).toISOString()}
                     {'fetched': (new Date()).toISOString()}
                 );
                 );
                 features.each(feature => {
                 features.each(feature => {
@@ -900,8 +900,8 @@ converse.plugins.add('converse-muc', {
              * has return a response IQ.
              * has return a response IQ.
              */
              */
             saveConfiguration (form) {
             saveConfiguration (form) {
-                const inputs = form ? sizzle(':input:not([type=button]):not([type=submit])', form) : [],
-                        configArray = _.map(inputs, u.webForm2xForm);
+                const inputs = form ? sizzle(':input:not([type=button]):not([type=submit])', form) : [];
+                const configArray = inputs.map(u.webForm2xForm);
                 return this.sendConfiguration(configArray);
                 return this.sendConfiguration(configArray);
             },
             },
 
 
@@ -1283,7 +1283,7 @@ converse.plugins.add('converse-muc', {
                 }
                 }
                 const occupant = this.occupants.findOccupant(data);
                 const occupant = this.occupants.findOccupant(data);
                 if (data.type === 'unavailable' && occupant) {
                 if (data.type === 'unavailable' && occupant) {
-                    if (!_.includes(data.states, converse.MUC_NICK_CHANGED_CODE) && !occupant.isMember()) {
+                    if (!data.states.includes(converse.MUC_NICK_CHANGED_CODE) && !occupant.isMember()) {
                         // We only destroy the occupant if this is not a nickname change operation.
                         // We only destroy the occupant if this is not a nickname change operation.
                         // and if they're not on the member lists.
                         // and if they're not on the member lists.
                         // Before destroying we set the new data, so
                         // Before destroying we set the new data, so
@@ -1575,7 +1575,7 @@ converse.plugins.add('converse-muc', {
             },
             },
 
 
             handleDisconnection (stanza) {
             handleDisconnection (stanza) {
-                const is_self = !_.isNull(stanza.querySelector("status[code='110']"));
+                const is_self = stanza.querySelector("status[code='110']") !== null;
                 const x = sizzle(`x[xmlns="${Strophe.NS.MUC_USER}"]`, stanza).pop();
                 const x = sizzle(`x[xmlns="${Strophe.NS.MUC_USER}"]`, stanza).pop();
                 if (!x) {
                 if (!x) {
                     return;
                     return;
@@ -1831,7 +1831,7 @@ converse.plugins.add('converse-muc', {
                 const nick = this.get('nick');
                 const nick = this.get('nick');
                 if (message.get('references').length) {
                 if (message.get('references').length) {
                     const mentions = message.get('references').filter(ref => (ref.type === 'mention')).map(ref => ref.value);
                     const mentions = message.get('references').filter(ref => (ref.type === 'mention')).map(ref => ref.value);
-                    return _.includes(mentions, nick);
+                    return mentions.includes(nick);
                 } else {
                 } else {
                     return (new RegExp(`\\b${nick}\\b`)).test(message.get('message'));
                     return (new RegExp(`\\b${nick}\\b`)).test(message.get('message'));
                 }
                 }
@@ -1894,7 +1894,7 @@ converse.plugins.add('converse-muc', {
                 }
                 }
                 vcards.push(_converse.vcards.findWhere({'jid': this.get('from')}));
                 vcards.push(_converse.vcards.findWhere({'jid': this.get('from')}));
 
 
-                _.forEach(_.filter(vcards, undefined), (vcard) => {
+                vcards.filter(v => v).forEach(vcard => {
                     if (hash && vcard.get('image_hash') !== hash) {
                     if (hash && vcard.get('image_hash') !== hash) {
                         _converse.api.vcard.update(vcard, true);
                         _converse.api.vcard.update(vcard, true);
                     }
                     }
@@ -2175,7 +2175,7 @@ converse.plugins.add('converse-muc', {
                     } else if (_.isString(jids)) {
                     } else if (_.isString(jids)) {
                         return createChatRoom(jids, attrs);
                         return createChatRoom(jids, attrs);
                     }
                     }
-                    return _.map(jids, _.partial(createChatRoom, _, attrs));
+                    return jids.map(jid => createChatRoom(jid, attrs));
                 },
                 },
 
 
                 /**
                 /**
@@ -2249,7 +2249,7 @@ converse.plugins.add('converse-muc', {
                         }
                         }
                         return room;
                         return room;
                     } else {
                     } else {
-                        return _.map(jids, jid => _converse.api.rooms.create(jid, attrs).maybeShow(force));
+                        return jids.map(jid => _converse.api.rooms.create(jid, attrs).maybeShow(force));
                     }
                     }
                 },
                 },
 
 
@@ -2297,7 +2297,7 @@ converse.plugins.add('converse-muc', {
                     if (_.isString(jids)) {
                     if (_.isString(jids)) {
                         return getChatRoom(jids, attrs);
                         return getChatRoom(jids, attrs);
                     }
                     }
-                    return _.map(jids, _.partial(getChatRoom, _, attrs));
+                    return jids.map(jid => getChatRoom(jid, attrs));
                 }
                 }
             }
             }
         });
         });

+ 1 - 1
src/headless/converse-roster.js

@@ -519,7 +519,7 @@ converse.plugins.add('converse-roster', {
                 const iq = $iq({'type': 'set'})
                 const iq = $iq({'type': 'set'})
                     .c('query', {'xmlns': Strophe.NS.ROSTER})
                     .c('query', {'xmlns': Strophe.NS.ROSTER})
                     .c('item', { jid, name });
                     .c('item', { jid, name });
-                _.each(groups, group => iq.c('group').t(group).up());
+                groups.forEach(g => iq.c('group').t(g).up());
                 return _converse.api.sendIQ(iq);
                 return _converse.api.sendIQ(iq);
             },
             },
 
 

+ 3 - 4
src/headless/utils/core.js

@@ -276,7 +276,7 @@ u.matchesSelector = function (el, selector) {
  * @param { String } selector - the selector they should be matched against
  * @param { String } selector - the selector they should be matched against
  */
  */
 u.queryChildren = function (el, selector) {
 u.queryChildren = function (el, selector) {
-    return _.filter(el.childNodes, _.partial(u.matchesSelector, _, selector));
+    return Array.from(el.childNodes).filter(el => u.matchesSelector(el, selector));
 };
 };
 
 
 u.contains = function (attr, query) {
 u.contains = function (attr, query) {
@@ -385,8 +385,7 @@ u.interpolate = function (string, o) {
  * @private
  * @private
  * @method u#onMultipleEvents
  * @method u#onMultipleEvents
  * @param { Array } events: An array of objects, with keys `object` and
  * @param { Array } events: An array of objects, with keys `object` and
- *   `event`, representing the event name and the object it's
- *    triggered upon.
+ *   `event`, representing the event name and the object it's triggered upon.
  * @param { Function } callback: The function to call once all events have
  * @param { Function } callback: The function to call once all events have
  *    been triggered.
  *    been triggered.
  */
  */
@@ -400,7 +399,7 @@ u.onMultipleEvents = function (events=[], callback) {
             triggered = [];
             triggered = [];
         }
         }
     }
     }
-    _.each(events, (map) => map.object.on(map.event, handler));
+    events.forEach(e => e.object.on(e.event, handler));
 };
 };
 
 
 u.safeSave = function (model, attributes) {
 u.safeSave = function (model, attributes) {