From 7a590f7c2219555a13fb66e41acb401804858a16 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 5 Aug 2019 01:39:57 +0200 Subject: [PATCH] Stop using certain lodash methods. * _.isNil * _.noop * _.isNull --- .eslintrc.json | 13 +++--- spec/autocomplete.js | 20 ++++----- spec/chatbox.js | 6 +-- spec/controlbox.js | 4 +- spec/messages.js | 36 ++++++++-------- spec/minchats.js | 2 +- spec/muc.js | 32 +++++++------- spec/omemo.js | 26 ++++++------ spec/room_registration.js | 2 +- spec/roomslist.js | 2 +- spec/roster.js | 2 +- spec/spoilers.js | 8 ++-- spec/user-details-modal.js | 2 +- src/converse-bookmark-views.js | 11 ++--- src/converse-chatboxviews.js | 4 +- src/converse-chatview.js | 27 ++++++------ src/converse-controlbox.js | 10 ++--- src/converse-dragresize.js | 4 +- src/converse-headline.js | 4 +- src/converse-message-view.js | 2 +- src/converse-modal.js | 6 +-- src/converse-muc-views.js | 38 ++++++++--------- src/converse-notification.js | 11 +++-- src/converse-oauth.js | 2 +- src/converse-omemo.js | 10 ++--- src/converse-register.js | 10 ++--- src/converse-roomslist.js | 14 +++--- src/converse-rosterview.js | 16 ++++--- src/headless/converse-bookmarks.js | 5 +-- src/headless/converse-chatboxes.js | 21 ++++----- src/headless/converse-core.js | 10 ++--- src/headless/converse-disco.js | 18 ++++---- src/headless/converse-muc.js | 6 +-- src/headless/converse-ping.js | 4 +- src/headless/converse-roster.js | 2 +- src/headless/converse-vcard.js | 2 +- src/headless/i18n.js | 2 +- src/headless/utils/core.js | 12 +++--- src/utils/html.js | 68 ++++++++++++++---------------- 39 files changed, 228 insertions(+), 246 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 36216f399..610cd6adb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -28,14 +28,15 @@ ] }], "lodash/import-scope": "off", - "lodash/prefer-invoke-map": "off", - "lodash/prefer-startswith": "off", "lodash/prefer-constant": "off", - "lodash/prefer-noop": "off", - "lodash/prefer-lodash-typecheck": "off", - "lodash/prefer-includes": "off", - "lodash/preferred-alias": "off", "lodash/prefer-get": "off", + "lodash/prefer-includes": "off", + "lodash/prefer-invoke-map": "off", + "lodash/prefer-is-nil": "off", + "lodash/prefer-lodash-typecheck": "off", + "lodash/prefer-noop": "off", + "lodash/prefer-startswith": "off", + "lodash/preferred-alias": "off", "accessor-pairs": "error", "array-bracket-spacing": "off", "array-callback-return": "error", diff --git a/spec/autocomplete.js b/spec/autocomplete.js index 7b94901f6..6a46824cb 100644 --- a/spec/autocomplete.js +++ b/spec/autocomplete.js @@ -41,8 +41,8 @@ const textarea = view.el.querySelector('textarea.chat-textarea'); const at_event = { 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 50, 'key': '@' }; @@ -84,8 +84,8 @@ // Press tab const tab_event = { 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 9, 'key': 'Tab' } @@ -97,7 +97,7 @@ const backspace_event = { 'target': textarea, - 'preventDefault': _.noop, + 'preventDefault': function noop () {}, 'keyCode': 8 } for (var i=0; i<3; i++) { @@ -129,7 +129,7 @@ const up_arrow_event = { 'target': textarea, 'preventDefault': () => (up_arrow_event.defaultPrevented = true), - 'stopPropagation': _.noop, + 'stopPropagation': function noop () {}, 'keyCode': 38 } view.onKeyDown(up_arrow_event); @@ -140,8 +140,8 @@ view.onKeyDown({ 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 13 // Enter }); expect(textarea.value).toBe('hello s @some2 '); @@ -195,8 +195,8 @@ // Press backspace const backspace_event = { 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 8, 'key': 'Backspace' } diff --git a/spec/chatbox.js b/spec/chatbox.js index bb3f042a8..273f4d1a2 100644 --- a/spec/chatbox.js +++ b/spec/chatbox.js @@ -497,7 +497,7 @@ const textarea = view.el.querySelector('.chat-textarea'); const ev = { target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }; view.onKeyDown(ev); @@ -546,7 +546,7 @@ let view = _converse.chatboxviews.get(contact_jid); toolbar = view.el.querySelector('ul.chat-toolbar'); call_button = toolbar.querySelector('.toggle-call'); - expect(_.isNull(call_button)).toBeTruthy(); + expect(call_button === null).toBeTruthy(); view.close(); // Now check that it's shown if enabled and that it emits // callButtonClicked @@ -1167,7 +1167,7 @@ view.el.querySelector('.chat-textarea').value = message; view.onKeyDown({ target: view.el.querySelector('textarea.chat-textarea'), - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(view.clearMessages).toHaveBeenCalled(); diff --git a/spec/controlbox.js b/spec/controlbox.js index 96ae06897..42d942f69 100644 --- a/spec/controlbox.js +++ b/spec/controlbox.js @@ -267,7 +267,7 @@ async function (done, _converse) { const xhr = { - 'open': _.noop, + 'open': function noop () {}, 'send': function () { xhr.responseText = JSON.stringify([ {"jid": "marty@mcfly.net", "fullname": "Marty McFly"}, @@ -328,7 +328,7 @@ test_utils.createContacts(_converse, 'all').openControlBox(); var modal; const xhr = { - 'open': _.noop, + 'open': function noop () {}, 'send': function () { const value = modal.el.querySelector('input[name="name"]').value; if (value === 'existing') { diff --git a/spec/messages.js b/spec/messages.js index d4ae25b8d..860bc4d9b 100644 --- a/spec/messages.js +++ b/spec/messages.js @@ -27,7 +27,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -55,7 +55,7 @@ textarea.value = 'But soft, what light through yonder window breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); expect(_converse.connection.send).toHaveBeenCalled(); @@ -161,7 +161,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -184,7 +184,7 @@ textarea.value = 'But soft, what light through yonder window breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); expect(_converse.connection.send).toHaveBeenCalled(); @@ -237,7 +237,7 @@ textarea.value = 'It is the east, and Juliet is the one.'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -246,7 +246,7 @@ textarea.value = 'Arise, fair sun, and kill the envious moon'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -277,7 +277,7 @@ textarea.value = 'It is the east, and Juliet is the sun.'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.model.messages.once('rendered', resolve)); @@ -1331,7 +1331,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await u.waitUntil(() => _converse.api.chats.get().length); @@ -1354,7 +1354,7 @@ textarea.value = 'Another message'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2537,7 +2537,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2561,7 +2561,7 @@ textarea.value = 'But soft, what light through yonder window breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); expect(_converse.connection.send).toHaveBeenCalled(); @@ -2636,7 +2636,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2715,7 +2715,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2751,7 +2751,7 @@ textarea.value = 'But soft, what light through yonder airlock breaks?'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2996,8 +2996,8 @@ textarea.value = 'hello @z3r0 @gibson @mr.robot, how are you?' const enter_event = { 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 13 // Enter } spyOn(_converse.connection, 'send'); @@ -3074,8 +3074,8 @@ textarea.value = 'hello @z3r0 @gibson @mr.robot, how are you?' const enter_event = { 'target': textarea, - 'preventDefault': _.noop, - 'stopPropagation': _.noop, + 'preventDefault': function noop () {}, + 'stopPropagation': function noop () {}, 'keyCode': 13 // Enter } view.onKeyDown(enter_event); diff --git a/spec/minchats.js b/spec/minchats.js index 5aa16e668..96f540e1d 100644 --- a/spec/minchats.js +++ b/spec/minchats.js @@ -87,7 +87,7 @@ _converse.minimized_chats.toggleview.model.set({'collapsed': true}); const unread_el = _converse.minimized_chats.toggleview.el.querySelector('.unread-message-count'); - expect(_.isNull(unread_el)).toBe(true); + expect(unread_el === null).toBe(true); for (i=0; i<3; i++) { contact_jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@montague.lit'; diff --git a/spec/muc.js b/spec/muc.js index e1508053b..291219f6e 100644 --- a/spec/muc.js +++ b/spec/muc.js @@ -2011,7 +2011,7 @@ textarea.value = text; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -2864,7 +2864,7 @@ const textarea = view.el.querySelector('.chat-textarea'); textarea.value = '/clear'; - const enter = { 'target': textarea, 'preventDefault': _.noop, 'keyCode': 13 }; + const enter = { 'target': textarea, 'preventDefault': function noop () {}, 'keyCode': 13 }; view.onKeyDown(enter); textarea.value = '/help'; view.onKeyDown(enter); @@ -2935,7 +2935,7 @@ await test_utils.openAndEnterChatRoom(_converse, 'lounge@montague.lit', 'romeo'); const view = _converse.chatboxviews.get('lounge@montague.lit'); var textarea = view.el.querySelector('.chat-textarea'); - const enter = { 'target': textarea, 'preventDefault': _.noop, 'keyCode': 13 }; + const enter = { 'target': textarea, 'preventDefault': function noop () {}, 'keyCode': 13 }; spyOn(window, 'confirm').and.callFake(() => true); textarea.value = '/clear'; view.onKeyDown(enter); @@ -2999,7 +2999,7 @@ textarea.value = '/member chris Welcome to the club!'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(_converse.connection.send).not.toHaveBeenCalled(); @@ -3011,7 +3011,7 @@ textarea.value = '/member marc Welcome to the club!'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(_converse.connection.send).toHaveBeenCalled(); @@ -3126,7 +3126,7 @@ textarea.value = '/topic This is the groupchat subject'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(_converse.connection.send).toHaveBeenCalled(); @@ -3136,7 +3136,7 @@ textarea.value = '/subject This is a new subject'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); @@ -3150,7 +3150,7 @@ textarea.value = '/Subject This is yet another subject'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(sent_stanza.textContent).toBe('This is yet another subject'); @@ -3173,7 +3173,7 @@ textarea.value = '/clear'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(view.clearMessages).toHaveBeenCalled(); @@ -3215,7 +3215,7 @@ textarea.value = '/owner'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(view.validateRoleOrAffiliationChangeArgs).toHaveBeenCalled(); @@ -3303,7 +3303,7 @@ textarea.value = '/ban'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(view.validateRoleOrAffiliationChangeArgs).toHaveBeenCalled(); @@ -3404,7 +3404,7 @@ textarea.value = '/kick'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); expect(view.validateRoleOrAffiliationChangeArgs).toHaveBeenCalled(); @@ -3508,7 +3508,7 @@ textarea.value = '/op'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); @@ -3651,7 +3651,7 @@ textarea.value = '/mute'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); @@ -5250,7 +5250,7 @@ view.model.features.set('moderated', false); expect(view.el.querySelector('.muc-bottom-panel')).toBe(null); let textarea = view.el.querySelector('.chat-textarea'); - expect(_.isNull(textarea)).toBe(false); + expect(textarea === null).toBe(false); view.model.features.set('moderated', true); expect(view.el.querySelector('.chat-textarea')).toBe(null); @@ -5281,7 +5281,7 @@ expect(bottom_panel).toBe(null); textarea = view.el.querySelector('.chat-textarea'); - expect(_.isNull(textarea)).toBe(false); + expect(textarea === null).toBe(false); expect(info_msgs.length).toBe(3); expect(info_msgs[2].textContent).toBe("troll has been given a voice"); diff --git a/spec/omemo.js b/spec/omemo.js index 41bbda851..d9ec39aea 100644 --- a/spec/omemo.js +++ b/spec/omemo.js @@ -126,7 +126,7 @@ textarea.value = 'This message will be encrypted'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); iq_stanza = await u.waitUntil(() => bundleFetched(_converse, contact_jid, '555')); @@ -310,7 +310,7 @@ textarea.value = 'This message will be encrypted'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); iq_stanza = await u.waitUntil(() => bundleFetched(_converse, contact_jid, '4e30f35051b7b8b42abe083742187228'), 1000); @@ -458,7 +458,7 @@ textarea.value = 'This is an encrypted message from this device'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); iq_stanza = await u.waitUntil(() => bundleFetched(_converse, _converse.bare_jid, '988349631')); @@ -515,7 +515,7 @@ textarea.value = 'This message will be encrypted'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 // Enter }); let iq_stanza = await u.waitUntil(() => deviceListFetched(_converse, contact_jid)); @@ -1232,7 +1232,7 @@ const toolbar = view.el.querySelector('.chat-toolbar'); expect(view.model.get('omemo_active')).toBe(undefined); let toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(true); expect(u.hasClass('fa-lock', toggle)).toBe(false); @@ -1251,7 +1251,7 @@ textarea.value = 'This message will be sent encrypted'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); @@ -1298,7 +1298,7 @@ const toolbar = view.el.querySelector('.chat-toolbar'); let toggle = toolbar.querySelector('.toggle-omemo'); expect(view.model.get('omemo_active')).toBe(undefined); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(true); expect(u.hasClass('fa-lock', toggle)).toBe(false); expect(u.hasClass('disabled', toggle)).toBe(false); @@ -1356,7 +1356,7 @@ expect(view.model.get('omemo_active')).toBe(true); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(false); expect(u.hasClass('fa-lock', toggle)).toBe(true); expect(u.hasClass('disabled', toggle)).toBe(false); @@ -1367,13 +1367,13 @@ view.model.features.save({'nonanonymous': false, 'semianonymous': true}); await u.waitUntil(() => !view.model.get('omemo_supported')); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(true); + expect(toggle === null).toBe(true); expect(view.model.get('omemo_supported')).toBe(false); view.model.features.save({'nonanonymous': true, 'semianonymous': false}); await u.waitUntil(() => view.model.get('omemo_supported')); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(true); expect(u.hasClass('fa-lock', toggle)).toBe(false); expect(u.hasClass('disabled', toggle)).toBe(false); @@ -1382,12 +1382,12 @@ view.model.features.save({'membersonly': false, 'open': true}); await u.waitUntil(() => !view.model.get('omemo_supported')); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(true); + expect(toggle === null).toBe(true); view.model.features.save({'membersonly': true, 'open': false}); await u.waitUntil(() => view.model.get('omemo_supported')); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(true); expect(u.hasClass('fa-lock', toggle)).toBe(false); expect(u.hasClass('disabled', toggle)).toBe(false); @@ -1436,7 +1436,7 @@ ); toggle = toolbar.querySelector('.toggle-omemo'); - expect(_.isNull(toggle)).toBe(false); + expect(toggle === null).toBe(false); expect(u.hasClass('fa-unlock', toggle)).toBe(true); expect(u.hasClass('fa-lock', toggle)).toBe(false); expect(u.hasClass('disabled', toggle)).toBe(true); diff --git a/spec/room_registration.js b/spec/room_registration.js index bd937aeb8..f229ea94a 100644 --- a/spec/room_registration.js +++ b/spec/room_registration.js @@ -24,7 +24,7 @@ textarea.value = '/register'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); let stanza = await u.waitUntil(() => _.filter( diff --git a/spec/roomslist.js b/spec/roomslist.js index 7fc91ff99..a1fb1ea76 100644 --- a/spec/roomslist.js +++ b/spec/roomslist.js @@ -337,7 +337,7 @@ // When the chat gets maximized again, the unread indicators are removed view.model.set({'minimized': false}); indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator"); - expect(_.isNull(indicator_el)); + expect(indicator_el === null); room_el = _converse.rooms_list_view.el.querySelector(".available-chatroom"); expect(_.includes(room_el.classList, 'unread-msgs')).toBeFalsy(); done(); diff --git a/spec/roster.js b/spec/roster.js index 8b161e0c5..32b95ab4e 100644 --- a/spec/roster.js +++ b/spec/roster.js @@ -121,7 +121,7 @@ const filter = _converse.rosterview.el.querySelector('.roster-filter'); test_utils.openControlBox(); - expect(_.isNull(filter)).toBe(false); + expect(filter === null).toBe(false); test_utils.createContacts(_converse, 'current').openControlBox(); const view = _converse.chatboxviews.get('controlbox'); diff --git a/spec/spoilers.js b/spec/spoilers.js index 09c6fb82b..c5d56d726 100644 --- a/spec/spoilers.js +++ b/spec/spoilers.js @@ -111,7 +111,7 @@ textarea.value = 'This is the spoiler'; view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -130,7 +130,7 @@ */ const stanza = _converse.connection.send.calls.argsFor(0)[0].tree(); const spoiler_el = stanza.querySelector('spoiler[xmlns="urn:xmpp:spoiler:0"]'); - expect(_.isNull(spoiler_el)).toBeFalsy(); + expect(spoiler_el === null).toBeFalsy(); expect(spoiler_el.textContent).toBe(''); const body_el = stanza.querySelector('body'); @@ -188,7 +188,7 @@ view.onKeyDown({ target: textarea, - preventDefault: _.noop, + preventDefault: function noop () {}, keyCode: 13 }); await new Promise((resolve, reject) => view.once('messageInserted', resolve)); @@ -208,7 +208,7 @@ const stanza = _converse.connection.send.calls.argsFor(0)[0].tree(); const spoiler_el = stanza.querySelector('spoiler[xmlns="urn:xmpp:spoiler:0"]'); - expect(_.isNull(spoiler_el)).toBeFalsy(); + expect(spoiler_el === null).toBeFalsy(); expect(spoiler_el.textContent).toBe('This is the hint'); const body_el = stanza.querySelector('body'); diff --git a/spec/user-details-modal.js b/spec/user-details-modal.js index 2d02e35ac..6134d9d5d 100644 --- a/spec/user-details-modal.js +++ b/spec/user-details-modal.js @@ -43,7 +43,7 @@ show_modal_button = view.el.querySelector('.show-user-details-modal'); show_modal_button.click(); remove_contact_button = modal.el.querySelector('button.remove-contact'); - expect(_.isNull(remove_contact_button)).toBeTruthy(); + expect(remove_contact_button === null).toBeTruthy(); done(); })); diff --git a/src/converse-bookmark-views.js b/src/converse-bookmark-views.js index 6e85fc390..03bd9b974 100644 --- a/src/converse-bookmark-views.js +++ b/src/converse-bookmark-views.js @@ -280,7 +280,7 @@ converse.plugins.add('converse-bookmark-views', { const controlboxview = _converse.chatboxviews.get('controlbox'); if (controlboxview !== undefined && !u.rootContains(_converse.root, this.el)) { const el = controlboxview.el.querySelector('.bookmarks-list'); - if (!_.isNull(el)) { + if (el !== null) { el.parentNode.replaceChild(this.el, el); } } @@ -301,13 +301,10 @@ converse.plugins.add('converse-bookmark-views', { renderBookmarkListElement (chatbox) { const bookmarkview = this.get(chatbox.get('jid')); - if (_.isNil(bookmarkview)) { - // A chat box has been closed, but we don't have a - // bookmark for it, so nothing further to do here. - return; + if (bookmarkview) { + bookmarkview.render(); + this.showOrHide(); } - bookmarkview.render(); - this.showOrHide(); }, showOrHide (item) { diff --git a/src/converse-chatboxviews.js b/src/converse-chatboxviews.js index 73d493d14..6d2f6b682 100644 --- a/src/converse-chatboxviews.js +++ b/src/converse-chatboxviews.js @@ -23,7 +23,7 @@ const AvatarMixin = { renderAvatar (el) { el = el || this.el; const avatar_el = el.querySelector('canvas.avatar, svg.avatar'); - if (_.isNull(avatar_el)) { + if (avatar_el === null) { return; } if (this.model.vcard) { @@ -91,7 +91,7 @@ converse.plugins.add('converse-chatboxviews', { */ if (!this.el) { let el = _converse.root.querySelector('#conversejs'); - if (_.isNull(el)) { + if (el === null) { el = document.createElement('div'); el.setAttribute('id', 'conversejs'); u.addClass(`theme-${_converse.theme}`, el); diff --git a/src/converse-chatview.js b/src/converse-chatview.js index b97a308b3..51d343d52 100644 --- a/src/converse-chatview.js +++ b/src/converse-chatview.js @@ -589,7 +589,7 @@ converse.plugins.add('converse-chatview', { }, addSpinner (append=false) { - if (_.isNull(this.el.querySelector('.spinner'))) { + if (this.el.querySelector('.spinner') === null) { if (append) { this.content.insertAdjacentHTML('beforeend', tpl_spinner()); this.scrollDown(); @@ -615,14 +615,13 @@ converse.plugins.add('converse-chatview', { * which specifies its creation date. */ insertDayIndicator (next_msg_el) { - const prev_msg_el = u.getPreviousElement(next_msg_el, ".message:not(.chat-state-notification)"), - prev_msg_date = _.isNull(prev_msg_el) ? null : prev_msg_el.getAttribute('data-isodate'), - next_msg_date = next_msg_el.getAttribute('data-isodate'); - - if (_.isNull(prev_msg_date) && _.isNull(next_msg_date)) { + const prev_msg_el = u.getPreviousElement(next_msg_el, ".message:not(.chat-state-notification)"); + const prev_msg_date = (prev_msg_el === null) ? null : prev_msg_el.getAttribute('data-isodate'); + const next_msg_date = next_msg_el.getAttribute('data-isodate'); + if (prev_msg_date === null && next_msg_date === null) { return; } - if (_.isNull(prev_msg_date) || dayjs(next_msg_date).isAfter(prev_msg_date, 'day')) { + if ((prev_msg_date === null) || dayjs(next_msg_date).isAfter(prev_msg_date, 'day')) { const day_date = dayjs(next_msg_date).startOf('day'); next_msg_el.insertAdjacentHTML('beforeBegin', tpl_new_day({ @@ -644,12 +643,12 @@ converse.plugins.add('converse-chatview', { getLastMessageDate (cutoff) { const first_msg = u.getFirstChildElement(this.content, '.message:not(.chat-state-notification)'); const oldest_date = first_msg ? first_msg.getAttribute('data-isodate') : null; - if (!_.isNull(oldest_date) && dayjs(oldest_date).isAfter(cutoff)) { + if (oldest_date !== null && dayjs(oldest_date).isAfter(cutoff)) { return null; } const last_msg = u.getLastChildElement(this.content, '.message:not(.chat-state-notification)'); const most_recent_date = last_msg ? last_msg.getAttribute('data-isodate') : null; - if (_.isNull(most_recent_date)) { + if (most_recent_date === null) { return null; } if (dayjs(most_recent_date).isBefore(cutoff)) { @@ -740,7 +739,7 @@ converse.plugins.add('converse-chatview', { const current_msg_date = dayjs(view.model.get('time')).toDate() || new Date(), previous_msg_date = this.getLastMessageDate(current_msg_date); - if (_.isNull(previous_msg_date)) { + if (previous_msg_date === null) { this.content.insertAdjacentElement('afterbegin', view.el); } else { const previous_msg_el = sizzle(`[data-isodate="${previous_msg_date.toISOString()}"]:last`, this.content).pop(); @@ -1040,14 +1039,14 @@ converse.plugins.add('converse-chatview', { const textarea = this.el.querySelector('.chat-textarea'); if (textarea.value && - (currently_correcting === null || currently_correcting.get('message') !== textarea.value)) { + ((currently_correcting === null) || currently_correcting.get('message') !== textarea.value)) { if (! confirm(__("You have an unsent message which will be lost if you continue. Are you sure?"))) { return; } } if (currently_correcting !== message) { - if (!_.isNil(currently_correcting)) { + if (currently_correcting !== null) { currently_correcting.save('correcting', false); } message.save('correcting', true); @@ -1277,7 +1276,7 @@ converse.plugins.add('converse-chatview', { insertEmojiPicker () { var picker_el = this.el.querySelector('.emoji-picker'); - if (!_.isNull(picker_el)) { + if (picker_el !== null) { picker_el.innerHTML = ''; picker_el.appendChild(this.emoji_picker_view.el); } @@ -1346,7 +1345,7 @@ converse.plugins.add('converse-chatview', { hideNewMessagesIndicator () { const new_msgs_indicator = this.el.querySelector('.new-msgs-indicator'); - if (!_.isNull(new_msgs_indicator)) { + if (new_msgs_indicator !== null) { new_msgs_indicator.classList.add('hidden'); } }, diff --git a/src/converse-controlbox.js b/src/converse-controlbox.js index a4458268b..af2599010 100644 --- a/src/converse-controlbox.js +++ b/src/converse-controlbox.js @@ -172,7 +172,7 @@ converse.plugins.add('converse-controlbox', { } }, - onReconnection: _.noop + onReconnection: function noop () {} }); @@ -245,7 +245,7 @@ converse.plugins.add('converse-controlbox', { insertBrandHeading () { const heading_el = this.el.querySelector('.brand-heading-container'); - if (_.isNull(heading_el)) { + if (heading_el === null) { const el = this.el.querySelector('.controlbox-head'); el.insertAdjacentHTML('beforeend', this.createBrandHeadingHTML()); } else { @@ -255,7 +255,9 @@ converse.plugins.add('converse-controlbox', { renderLoginPanel () { this.el.classList.add("logged-out"); - if (_.isNil(this.loginpanel)) { + if (this.loginpanel) { + this.loginpanel.render(); + } else { this.loginpanel = new _converse.LoginPanel({ 'model': new _converse.LoginPanelModel() }); @@ -263,8 +265,6 @@ converse.plugins.add('converse-controlbox', { panes.innerHTML = ''; panes.appendChild(this.loginpanel.render().el); this.insertBrandHeading(); - } else { - this.loginpanel.render(); } this.loginpanel.initPopovers(); return this; diff --git a/src/converse-dragresize.js b/src/converse-dragresize.js index 4a0bbbdc2..33d84fec0 100644 --- a/src/converse-dragresize.js +++ b/src/converse-dragresize.js @@ -221,7 +221,7 @@ converse.plugins.add('converse-dragresize', { height = ""; } const flyout_el = this.el.querySelector('.box-flyout'); - if (!_.isNull(flyout_el)) { + if (flyout_el !== null) { flyout_el.style.height = height; } }, @@ -234,7 +234,7 @@ converse.plugins.add('converse-dragresize', { } this.el.style.width = width; const flyout_el = this.el.querySelector('.box-flyout'); - if (!_.isNull(flyout_el)) { + if (flyout_el !== null) { flyout_el.style.width = width; } }, diff --git a/src/converse-headline.js b/src/converse-headline.js index c4cd4c2c7..623cd315d 100644 --- a/src/converse-headline.js +++ b/src/converse-headline.js @@ -112,8 +112,8 @@ converse.plugins.add('converse-headline', { }, // Override to avoid the methods in converse-chatview.js - 'renderMessageForm': _.noop, - 'afterShown': _.noop + 'renderMessageForm': function noop () {}, + 'afterShown': function noop () {} }); async function onHeadlineMessage (message) { diff --git a/src/converse-message-view.js b/src/converse-message-view.js index ac6682b63..07350c556 100644 --- a/src/converse-message-view.js +++ b/src/converse-message-view.js @@ -177,7 +177,7 @@ converse.plugins.add('converse-message-view', { }, replaceElement (msg) { - if (!_.isNil(this.el.parentElement)) { + if (this.el.parentElement) { this.el.parentElement.replaceChild(msg, this.el); } this.setElement(msg); diff --git a/src/converse-modal.js b/src/converse-modal.js index ed614280a..3b7a43f4e 100644 --- a/src/converse-modal.js +++ b/src/converse-modal.js @@ -28,11 +28,7 @@ converse.plugins.add('converse-modal', { backdrop: 'static', keyboard: true }); - this.el.addEventListener('hide.bs.modal', (event) => { - if (!_.isNil(this.trigger_el)) { - this.trigger_el.classList.remove('selected'); - } - }, false); + this.el.addEventListener('hide.bs.modal', () => u.removeClass('selected', this.trigger_el), false); }, insertIntoDOM () { diff --git a/src/converse-muc-views.js b/src/converse-muc-views.js index 36228a01c..36655ede1 100644 --- a/src/converse-muc-views.js +++ b/src/converse-muc-views.js @@ -1138,7 +1138,7 @@ converse.plugins.add('converse-muc-views', { hideChatRoomContents () { const container_el = this.el.querySelector('.chatroom-body'); - if (!_.isNull(container_el)) { + if (container_el !== null) { [].forEach.call(container_el.children, child => child.classList.add('hidden')); } }, @@ -1248,7 +1248,7 @@ converse.plugins.add('converse-muc-views', { getNotificationWithMessage (message) { let el = this.content.lastElementChild; - while (!_.isNil(el)) { + while (el) { const data = _.get(el, 'dataset', {}); if (!_.includes(_.get(el, 'classList', []), 'chat-info')) { return; @@ -1342,10 +1342,10 @@ converse.plugins.add('converse-muc-views', { if (data.leave === nick) { let message; - if (_.isNil(stat)) { - message = __('%1$s has left and re-entered the groupchat', nick); - } else { + if (stat) { message = __('%1$s has left and re-entered the groupchat. "%2$s"', nick, stat); + } else { + message = __('%1$s has left and re-entered the groupchat', nick); } const data = { 'data_name': 'leavejoin', @@ -1361,10 +1361,10 @@ converse.plugins.add('converse-muc-views', { setTimeout(() => el.parentElement && el.parentElement.removeChild(el), 5500); } else { let message; - if (_.isNil(stat)) { - message = __('%1$s has entered the groupchat', nick); - } else { + if (stat) { message = __('%1$s has entered the groupchat. "%2$s"', nick, stat); + } else { + message = __('%1$s has entered the groupchat', nick); } const data = { 'data_name': 'join', @@ -1397,10 +1397,10 @@ converse.plugins.add('converse-muc-views', { if (dataset.join === nick) { let message; - if (_.isNil(stat)) { - message = __('%1$s has entered and left the groupchat', nick); - } else { + if (stat) { message = __('%1$s has entered and left the groupchat. "%2$s"', nick, stat); + } else { + message = __('%1$s has entered and left the groupchat', nick); } const data = { 'data_name': 'joinleave', @@ -1416,10 +1416,10 @@ converse.plugins.add('converse-muc-views', { setTimeout(() => el.parentElement && el.parentElement.removeChild(el), 5500); } else { let message; - if (_.isNil(stat)) { - message = __('%1$s has left the groupchat', nick); - } else { + if (stat) { message = __('%1$s has left the groupchat. "%2$s"', nick, stat); + } else { + message = __('%1$s has left the groupchat', nick); } const data = { 'message': message, @@ -1469,7 +1469,7 @@ converse.plugins.add('converse-muc-views', { * list are both visible. */ const spinner = this.el.querySelector('.spinner'); - if (!_.isNull(spinner)) { + if (spinner !== null) { u.removeElement(spinner); this.renderAfterTransition(); } @@ -1757,7 +1757,7 @@ converse.plugins.add('converse-muc-views', { renderInviteWidget () { const widget = this.el.querySelector('.room-invite'); if (this.shouldInviteWidgetBeShown()) { - if (_.isNull(widget)) { + if (widget === null) { const heading = this.el.querySelector('.occupants-heading'); heading.insertAdjacentHTML( 'afterend', @@ -1768,7 +1768,7 @@ converse.plugins.add('converse-muc-views', { ); this.initInviteWidget(); } - } else if (!_.isNull(widget)) { + } else if (widget !== null) { widget.remove(); } return this; @@ -1809,7 +1809,7 @@ converse.plugins.add('converse-muc-views', { const form = this.el.querySelector('.room-invite form'), input = form.querySelector('.invited-contact'), error = form.querySelector('.error'); - if (!_.isNull(error)) { + if (error !== null) { error.parentNode.removeChild(error); } input.value = ''; @@ -1844,7 +1844,7 @@ converse.plugins.add('converse-muc-views', { initInviteWidget () { const form = this.el.querySelector('.room-invite form'); - if (_.isNull(form)) { + if (form === null) { return; } form.addEventListener('submit', this.inviteFormSubmitted.bind(this), false); diff --git a/src/converse-notification.js b/src/converse-notification.js index 988e89feb..207443b19 100644 --- a/src/converse-notification.js +++ b/src/converse-notification.js @@ -62,7 +62,7 @@ converse.plugins.add('converse-notification', { } const room = _converse.chatboxes.get(room_jid); const body = message.querySelector('body'); - if (_.isNull(body)) { + if (body === null) { return false; } const mentioned = (new RegExp(`\\b${room.get('nick')}\\b`)).test(body.textContent); @@ -76,10 +76,9 @@ converse.plugins.add('converse-notification', { _converse.isMessageToHiddenChat = function (message) { if (_converse.isUniView()) { - const jid = Strophe.getBareJidFromJid(message.getAttribute('from')), - view = _converse.chatboxviews.get(jid); - - if (!_.isNil(view)) { + const jid = Strophe.getBareJidFromJid(message.getAttribute('from')); + const view = _converse.chatboxviews.get(jid); + if (view) { return view.model.get('hidden') || _converse.windowState === 'hidden' || !u.isVisible(view.el); } return true; @@ -89,7 +88,7 @@ converse.plugins.add('converse-notification', { _converse.shouldNotifyOfMessage = function (message) { const forwarded = message.querySelector('forwarded'); - if (!_.isNull(forwarded)) { + if (forwarded !== null) { return false; } else if (message.getAttribute('type') === 'groupchat') { return _converse.shouldNotifyOfGroupMessage(message); diff --git a/src/converse-oauth.js b/src/converse-oauth.js index 14d3ffdff..128ad92c6 100644 --- a/src/converse-oauth.js +++ b/src/converse-oauth.js @@ -78,7 +78,7 @@ converse.plugins.add("converse-oauth", { }); _converse.OAuthProviders = _converse.Collection.extend({ - 'sync': __.noop, + 'sync': _function noop () {}, initialize () { _.each(_converse.user_settings.oauth_providers, (provider) => { diff --git a/src/converse-omemo.js b/src/converse-omemo.js index 98a0366ae..3f36f06b5 100644 --- a/src/converse-omemo.js +++ b/src/converse-omemo.js @@ -70,7 +70,7 @@ function parseBundle (bundle_el) { converse.plugins.add('converse-omemo', { enabled (_converse) { - return !_.isNil(window.libsignal) && !_converse.blacklisted_plugins.includes('converse-omemo') && _converse.config.get('trusted'); + return window.libsignal && !_converse.blacklisted_plugins.includes('converse-omemo') && _converse.config.get('trusted'); }, dependencies: ["converse-chatview", "converse-pubsub"], @@ -696,7 +696,7 @@ converse.plugins.add('converse-omemo', { }, isTrustedIdentity (identifier, identity_key, direction) { - if (_.isNil(identifier)) { + if (identifier === null || identifier === undefined) { throw new Error("Can't check identity key for invalid key"); } if (!(identity_key instanceof ArrayBuffer)) { @@ -710,14 +710,14 @@ converse.plugins.add('converse-omemo', { }, loadIdentityKey (identifier) { - if (_.isNil(identifier)) { + if (identifier === null || identifier === undefined) { throw new Error("Can't load identity_key for invalid identifier"); } return Promise.resolve(u.base64ToArrayBuffer(this.get('identity_key'+identifier))); }, saveIdentity (identifier, identity_key) { - if (_.isNil(identifier)) { + if (identifier === null || identifier === undefined) { throw new Error("Can't save identity_key for invalid identifier"); } const address = new libsignal.SignalProtocolAddress.fromString(identifier), @@ -1104,7 +1104,7 @@ converse.plugins.add('converse-omemo', { async function fetchOwnDevices () { await fetchDeviceLists(); let own_devicelist = _converse.devicelists.get(_converse.bare_jid); - if (_.isNil(own_devicelist)) { + if (!own_devicelist) { own_devicelist = _converse.devicelists.create({'jid': _converse.bare_jid}); } return own_devicelist.fetchDevices(); diff --git a/src/converse-register.js b/src/converse-register.js index f05548ff7..3bc7f1f52 100644 --- a/src/converse-register.js +++ b/src/converse-register.js @@ -108,7 +108,7 @@ converse.plugins.add('converse-register', { showLoginOrRegisterForm () { const { _converse } = this.__super__; - if (_.isNil(this.registerpanel)) { + if (!this.registerpanel) { return; } if (this.model.get('active-form') == "register") { @@ -308,7 +308,7 @@ converse.plugins.add('converse-register', { * other methods. */ if (ev && ev.preventDefault) { ev.preventDefault(); } - if (_.isNull(ev.target.querySelector('input[name=domain]'))) { + if (ev.target.querySelector('input[name=domain]') === null) { this.submitRegistrationForm(ev.target); } else { this.onProviderChosen(ev.target); @@ -367,7 +367,7 @@ converse.plugins.add('converse-register', { giveFeedback (message, klass) { let feedback = this.el.querySelector('.reg-feedback'); - if (!_.isNull(feedback)) { + if (feedback !== null) { feedback.parentNode.removeChild(feedback); } const form = this.el.querySelector('form'); @@ -513,10 +513,10 @@ converse.plugins.add('converse-register', { showValidationError (message) { const form = this.el.querySelector('form'); let flash = form.querySelector('.form-errors'); - if (_.isNull(flash)) { + if (flash === null) { flash = ''; const instructions = form.querySelector('p.instructions'); - if (_.isNull(instructions)) { + if (instructions === null) { form.insertAdjacentHTML('afterbegin', flash); } else { instructions.insertAdjacentHTML('afterend', flash); diff --git a/src/converse-roomslist.js b/src/converse-roomslist.js index 3d9b4bc09..8539d3b0c 100644 --- a/src/converse-roomslist.js +++ b/src/converse-roomslist.js @@ -66,26 +66,24 @@ converse.plugins.add('converse-roomslist', { _converse.chatboxes.on('change:num_unread', this.onChatBoxChanged, this); _converse.chatboxes.on('change:num_unread_general', this.onChatBoxChanged, this); _converse.chatboxes.on('remove', this.onChatBoxRemoved, this); - this.reset(_.map(_converse.chatboxes.where({'type': 'chatroom'}), 'attributes')); + this.reset(_.map(_converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE}), 'attributes')); }, onChatBoxAdded (item) { - if (item.get('type') === 'chatroom') { + if (item.get('type') === _converse.CHATROOMS_TYPE) { this.create(item.attributes); } }, onChatBoxChanged (item) { - if (item.get('type') === 'chatroom') { + if (item.get('type') === _converse.CHATROOMS_TYPE) { const room = this.get(item.get('jid')); - if (!_.isNil(room)) { - room.set(item.attributes); - } + room && room.set(item.attributes); } }, onChatBoxRemoved (item) { - if (item.get('type') === 'chatroom') { + if (item.get('type') === _converse.CHATROOMS_TYPE) { const room = this.get(item.get('jid')) this.remove(room); } @@ -201,7 +199,7 @@ converse.plugins.add('converse-roomslist', { const controlboxview = _converse.chatboxviews.get('controlbox'); if (controlboxview !== undefined && !u.rootContains(_converse.root, this.el)) { const el = controlboxview.el.querySelector('.open-rooms-list'); - if (!_.isNull(el)) { + if (el !== null) { el.parentNode.replaceChild(this.el, el); } } diff --git a/src/converse-rosterview.js b/src/converse-rosterview.js index 5a85c08df..5420b819a 100644 --- a/src/converse-rosterview.js +++ b/src/converse-rosterview.js @@ -648,13 +648,17 @@ converse.plugins.add('converse-rosterview', { return matches; }, + /** + * Filter the group's contacts based on the query "q". + * + * If all contacts are filtered out (i.e. hidden), then the + * group must be filtered out as well. + * @private + * @param { string } q - The query to filter against + * @param { string } type + */ filter (q, type) { - /* Filter the group's contacts based on the query "q". - * - * If all contacts are filtered out (i.e. hidden), then the - * group must be filtered out as well. - */ - if (_.isNil(q)) { + if (q === null || q === undefined) { type = type || _converse.rosterview.filter_view.model.get('filter_type'); if (type === 'state') { q = _converse.rosterview.filter_view.model.get('chat_state'); diff --git a/src/headless/converse-bookmarks.js b/src/headless/converse-bookmarks.js index 92867bb74..9457576f9 100644 --- a/src/headless/converse-bookmarks.js +++ b/src/headless/converse-bookmarks.js @@ -231,10 +231,9 @@ converse.plugins.add('converse-bookmarks', { window.sessionStorage.setItem(this.fetched_flag, true); _converse.log('Error while fetching bookmarks', Strophe.LogLevel.ERROR); _converse.log(iq.outerHTML, Strophe.LogLevel.DEBUG); - if (!_.isNil(deferred)) { + if (deferred) { if (iq.querySelector('error[type="cancel"] item-not-found')) { - // Not an exception, the user simply doesn't have - // any bookmarks. + // Not an exception, the user simply doesn't have any bookmarks. return deferred.resolve(); } else { return deferred.reject(new Error("Could not fetch bookmarks")); diff --git a/src/headless/converse-chatboxes.js b/src/headless/converse-chatboxes.js index fc110a632..f1d7a3c36 100644 --- a/src/headless/converse-chatboxes.js +++ b/src/headless/converse-chatboxes.js @@ -154,7 +154,7 @@ converse.plugins.add('converse-chatboxes', { * * https://xmpp.org/extensions/xep-0363.html#request */ - if (_.isNil(this.file)) { + if (!this.file) { return Promise.reject(new Error("file is undefined")); } const iq = converse.env.$iq({ @@ -853,7 +853,7 @@ converse.plugins.add('converse-chatboxes', { }, isArchived (original_stanza) { - return !_.isNil(sizzle(`result[xmlns="${Strophe.NS.MAM}"]`, original_stanza).pop()); + return !!sizzle(`result[xmlns="${Strophe.NS.MAM}"]`, original_stanza).pop(); }, getErrorMessage (stanza) { @@ -902,8 +902,8 @@ converse.plugins.add('converse-chatboxes', { const attrs = Object.assign({ 'chat_state': chat_state, 'is_archived': this.isArchived(original_stanza), - 'is_delayed': !_.isNil(delay), - 'is_spoiler': !_.isNil(spoiler), + 'is_delayed': !!delay, + 'is_spoiler': !!spoiler, 'is_single_emoji': text ? u.isSingleEmoji(text) : false, 'message': text, 'msgid': msgid, @@ -965,8 +965,9 @@ converse.plugins.add('converse-chatboxes', { /* Given a newly received message, update the unread counter if * necessary. */ - if (!message) { return; } - if (_.isNil(message.get('message'))) { return; } + if (!message || !message.get('message')) { + return; + } if (utils.isNewMessage(message) && this.isHidden()) { this.save({'num_unread': this.get('num_unread') + 1}); _converse.incrementMsgCounter(); @@ -998,7 +999,7 @@ converse.plugins.add('converse-chatboxes', { _converse.connection.addHandler(stanza => { // Message receipts are usually without the `type` attribute. See #1353 - if (!_.isNull(stanza.getAttribute('type'))) { + if (stanza.getAttribute('type') !== null) { // TODO: currently Strophe has no way to register a handler // for stanzas without a `type` attribute. // We could update it to accept null to mean no attribute, @@ -1096,7 +1097,7 @@ converse.plugins.add('converse-chatboxes', { const forwarded = stanza.querySelector('forwarded'); const original_stanza = stanza; - if (!_.isNull(forwarded)) { + if (forwarded !== null) { const xmlns = Strophe.NS.CARBONS; is_carbon = sizzle(`received[xmlns="${xmlns}"]`, original_stanza).length > 0; if (is_carbon && original_stanza.getAttribute('from') !== _converse.bare_jid) { @@ -1112,7 +1113,7 @@ converse.plugins.add('converse-chatboxes', { const from_bare_jid = Strophe.getBareJidFromJid(from_jid); const is_me = from_bare_jid === _converse.bare_jid; - if (is_me &&_.isNull(to_jid)) { + if (is_me && to_jid === null) { return _converse.log( `Don't know how to handle message stanza without 'to' attribute. ${stanza.outerHTML}`, Strophe.LogLevel.ERROR @@ -1268,7 +1269,7 @@ converse.plugins.add('converse-chatboxes', { attrs.fullname = _.get(contact, 'attributes.fullname'); } const chatbox = _converse.chatboxes.getChatBox(jids, attrs, true); - if (_.isNil(chatbox)) { + if (!chatbox) { _converse.log("Could not open chatbox for JID: "+jids, Strophe.LogLevel.ERROR); return; } diff --git a/src/headless/converse-core.js b/src/headless/converse-core.js index bb0909d07..ca378dd0b 100644 --- a/src/headless/converse-core.js +++ b/src/headless/converse-core.js @@ -477,9 +477,7 @@ function connect (credentials) { BOSH_WAIT ); } else if (_converse.authentication === _converse.LOGIN) { - const password = _.isNil(credentials) - ? _converse.connection.pass || _converse.password - : credentials.password; + const password = credentials ? credentials.password : (_converse.connection.pass || _converse.password); if (!password) { if (_converse.auto_login) { throw new Error("autoLogin: If you use auto_login and "+ @@ -834,7 +832,7 @@ _converse.initialize = async function (settings, callback) { // Module-level variables // ---------------------- - this.callback = callback || _.noop; + this.callback = callback || function noop () {}; /* When reloading the page: * For new sessions, we need to send out a presence stanza to notify * the server/network that we're online. @@ -1085,7 +1083,7 @@ _converse.initialize = async function (settings, callback) { this.msg_counter += 1; const unreadMsgCount = this.msg_counter; let title = document.title; - if (_.isNil(title)) { + if (!title) { return; } if (title.search(/^Messages \(\d+\) /) === -1) { @@ -1098,7 +1096,7 @@ _converse.initialize = async function (settings, callback) { this.clearMsgCounter = function () { this.msg_counter = 0; let title = document.title; - if (_.isNil(title)) { + if (!title) { return; } if (title.search(/^Messages \(\d+\) /) !== -1) { diff --git a/src/headless/converse-disco.js b/src/headless/converse-disco.js index e756fa429..bb85e3837 100644 --- a/src/headless/converse-disco.js +++ b/src/headless/converse-disco.js @@ -407,7 +407,7 @@ converse.plugins.add('converse-disco', { */ async getFeature (name, xmlns) { await _converse.api.waitUntil('streamFeaturesAdded'); - if (_.isNil(name) || _.isNil(xmlns)) { + if (!name || !xmlns) { throw new Error("name and xmlns need to be provided when calling disco.stream.getFeature"); } if (_converse.stream_features === undefined && !_converse.api.connection.connected()) { @@ -567,7 +567,7 @@ converse.plugins.add('converse-disco', { */ async get (jid, create=false) { await _converse.api.waitUntil('discoInitialized'); - if (_.isNil(jid)) { + if (!jid) { return _converse.disco_entities; } if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) { @@ -626,7 +626,7 @@ converse.plugins.add('converse-disco', { * _converse.api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid); */ async get (feature, jid) { - if (_.isNil(jid)) { + if (!jid) { throw new TypeError('You need to provide an entity JID'); } await _converse.api.waitUntil('discoInitialized'); @@ -682,7 +682,7 @@ converse.plugins.add('converse-disco', { * await _converse.api.disco.refreshFeatures('room@conference.example.org'); */ async refreshFeatures (jid) { - if (_.isNil(jid)) { + if (!jid) { throw new TypeError('api.disco.refreshFeatures: You need to provide an entity JID'); } await _converse.api.waitUntil('discoInitialized'); @@ -712,7 +712,7 @@ converse.plugins.add('converse-disco', { * const features = await _converse.api.disco.getFeatures('room@conference.example.org'); */ async getFeatures (jid) { - if (_.isNil(jid)) { + if (!jid) { throw new TypeError('api.disco.getFeatures: You need to provide an entity JID'); } await _converse.api.waitUntil('discoInitialized'); @@ -733,7 +733,7 @@ converse.plugins.add('converse-disco', { * const fields = await _converse.api.disco.getFields('room@conference.example.org'); */ async getFields (jid) { - if (_.isNil(jid)) { + if (!jid) { throw new TypeError('api.disco.getFields: You need to provide an entity JID'); } await _converse.api.waitUntil('discoInitialized'); @@ -765,10 +765,10 @@ converse.plugins.add('converse-disco', { * @example * _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then( * function (identity) { - * if (_.isNil(identity)) { - * // The entity DOES NOT have this identity - * } else { + * if (identity) { * // The entity DOES have this identity + * } else { + * // The entity DOES NOT have this identity * } * } * ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); diff --git a/src/headless/converse-muc.js b/src/headless/converse-muc.js index 983e69bfa..02a59d9fb 100644 --- a/src/headless/converse-muc.js +++ b/src/headless/converse-muc.js @@ -1027,8 +1027,8 @@ converse.plugins.add('converse-muc', { */ saveAffiliationAndRole (pres) { const item = sizzle(`x[xmlns="${Strophe.NS.MUC_USER}"] item`, pres).pop(); - const is_self = !_.isNull(pres.querySelector("status[code='110']")); - if (is_self && !_.isNil(item)) { + const is_self = (pres.querySelector("status[code='110']") !== null); + if (is_self && item) { const affiliation = item.getAttribute('affiliation'); const role = item.getAttribute('role'); const changes = {}; @@ -1848,7 +1848,7 @@ converse.plugins.add('converse-muc', { incrementUnreadMsgCounter (message) { if (!message) { return; } const body = message.get('message'); - if (_.isNil(body)) { return; } + if (!body) { return; } if (u.isNewMessage(message) && this.isHidden()) { const settings = {'num_unread_general': this.get('num_unread_general') + 1}; if (this.isUserMentioned(message)) { diff --git a/src/headless/converse-ping.js b/src/headless/converse-ping.js index 4ea2cb514..630f1ebc9 100644 --- a/src/headless/converse-ping.js +++ b/src/headless/converse-ping.js @@ -37,9 +37,7 @@ converse.plugins.add('converse-ping', { // // var feature = _converse.disco_entities[_converse.domain].features.findWhere({'var': Strophe.NS.PING}); _converse.lastStanzaDate = new Date(); - if (_.isNil(jid)) { - jid = Strophe.getDomainFromJid(_converse.bare_jid); - } + jid = jid || Strophe.getDomainFromJid(_converse.bare_jid); if (timeout === undefined ) { timeout = null; } if (success === undefined ) { success = null; } if (error === undefined ) { error = null; } diff --git a/src/headless/converse-roster.js b/src/headless/converse-roster.js index 960e9ae5f..39b2e364b 100644 --- a/src/headless/converse-roster.js +++ b/src/headless/converse-roster.js @@ -191,7 +191,7 @@ converse.plugins.add('converse-roster', { 'name': name, 'priority': _.isNaN(parseInt(priority, 10)) ? 0 : parseInt(priority, 10), 'show': _.propertyOf(presence.querySelector('show'))('textContent') || 'online', - 'timestamp': _.isNil(delay) ? (new Date()).toISOString() : dayjs(delay.getAttribute('stamp')).toISOString() + 'timestamp': delay ? dayjs(delay.getAttribute('stamp')).toISOString() : (new Date()).toISOString() }; if (resource) { resource.save(settings); diff --git a/src/headless/converse-vcard.js b/src/headless/converse-vcard.js index fcd8a22bc..1c58c809b 100644 --- a/src/headless/converse-vcard.js +++ b/src/headless/converse-vcard.js @@ -65,7 +65,7 @@ converse.plugins.add('converse-vcard', { async function onVCardData (jid, iq) { const vcard = iq.querySelector('vCard'); let result = {}; - if (!_.isNull(vcard)) { + if (vcard !== null) { result = { 'stanza': iq, 'fullname': _.get(vcard.querySelector('FN'), 'textContent'), diff --git a/src/headless/i18n.js b/src/headless/i18n.js index bb6b58e75..a46a2d33a 100644 --- a/src/headless/i18n.js +++ b/src/headless/i18n.js @@ -110,7 +110,7 @@ export default { }, translate (str) { - if (_.isNil(jed_instance)) { + if (!jed_instance) { return Jed.sprintf.apply(Jed, arguments); } const t = jed_instance.translate(str); diff --git a/src/headless/utils/core.js b/src/headless/utils/core.js index 092f4d006..bd38a3cb2 100644 --- a/src/headless/utils/core.js +++ b/src/headless/utils/core.js @@ -21,10 +21,10 @@ const Strophe = strophe.default.Strophe; const u = {}; u.logger = Object.assign({ - 'debug': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'error': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'info': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'warn': _.get(console, 'log') ? console.log.bind(console) : _.noop + 'debug': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'error': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'info': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'warn': _.get(console, 'log') ? console.log.bind(console) : function noop () {} }, console); u.isTagEqual = function (stanza, name) { @@ -144,9 +144,7 @@ u.isHeadlineMessage = function (_converse, message) { if (chatbox && chatbox.get('type') === _converse.CHATROOMS_TYPE) { return false; } - if (message.getAttribute('type') !== 'error' && - !_.isNil(from_jid) && - !_.includes(from_jid, '@')) { + if (message.getAttribute('type') !== 'error' && from_jid && !_.includes(from_jid, '@')) { // Some servers (I'm looking at you Prosody) don't set the message // type to "headline" when sending server messages. For now we // check if an @ signal is included, and if not, we assume it's diff --git a/src/utils/html.js b/src/utils/html.js index 3f7902ed5..338eb4887 100644 --- a/src/utils/html.js +++ b/src/utils/html.js @@ -34,10 +34,10 @@ function getAutoCompleteProperty (name, options) { } const logger = _.assign({ - 'debug': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'error': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'info': _.get(console, 'log') ? console.log.bind(console) : _.noop, - 'warn': _.get(console, 'log') ? console.log.bind(console) : _.noop + 'debug': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'error': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'info': _.get(console, 'log') ? console.log.bind(console) : function noop () {}, + 'warn': _.get(console, 'log') ? console.log.bind(console) : function noop () {} }, console); const XFORM_TYPE_MAP = { @@ -227,15 +227,15 @@ u.calculateElementHeight = function (el) { u.getNextElement = function (el, selector='*') { let next_el = el.nextElementSibling; - while (!_.isNull(next_el) && !sizzle.matchesSelector(next_el, selector)) { + while ((next_el instanceof Element) && !sizzle.matchesSelector(next_el, selector)) { next_el = next_el.nextElementSibling; } return next_el; } u.getPreviousElement = function (el, selector='*') { - let prev_el = el.previousSibling; - while (!_.isNull(prev_el) && !sizzle.matchesSelector(prev_el, selector)) { + let prev_el = el.previousElementSibling; + while ((prev_el instanceof Element) && !sizzle.matchesSelector(prev_el, selector)) { prev_el = prev_el.previousSibling } return prev_el; @@ -243,7 +243,7 @@ u.getPreviousElement = function (el, selector='*') { u.getFirstChildElement = function (el, selector='*') { let first_el = el.firstElementChild; - while (!_.isNull(first_el) && !sizzle.matchesSelector(first_el, selector)) { + while ((first_el instanceof Element) && !sizzle.matchesSelector(first_el, selector)) { first_el = first_el.nextSibling } return first_el; @@ -251,33 +251,29 @@ u.getFirstChildElement = function (el, selector='*') { u.getLastChildElement = function (el, selector='*') { let last_el = el.lastElementChild; - while (!_.isNull(last_el) && !sizzle.matchesSelector(last_el, selector)) { + while ((last_el instanceof Element) && !sizzle.matchesSelector(last_el, selector)) { last_el = last_el.previousSibling } return last_el; } u.hasClass = function (className, el) { - return el.classList.contains(className); + return (el instanceof Element) && el.classList.contains(className); }; u.addClass = function (className, el) { - if (el instanceof Element) { - el.classList.add(className); - } + (el instanceof Element) && el.classList.add(className); + return el; } u.removeClass = function (className, el) { - if (el instanceof Element) { - el.classList.remove(className); - } + (el instanceof Element) && el.classList.remove(className); return el; } u.removeElement = function (el) { - if (!_.isNil(el) && !_.isNil(el.parentNode)) { - el.parentNode.removeChild(el); - } + (el instanceof Element) && el.parentNode && el.parentNode.removeChild(el); + return el; } u.showElement = _.flow( @@ -286,15 +282,13 @@ u.showElement = _.flow( ) u.hideElement = function (el) { - if (!_.isNil(el)) { - el.classList.add('hidden'); - } + (el instanceof Element) && el.classList.add('hidden'); return el; } u.ancestor = function (el, selector) { let parent = el; - while (!_.isNil(parent) && !sizzle.matchesSelector(parent, selector)) { + while ((parent instanceof Element) && !sizzle.matchesSelector(parent, selector)) { parent = parent.parentElement; } return parent; @@ -304,7 +298,7 @@ u.nextUntil = function (el, selector, include_self=false) { /* Return the element's siblings until one matches the selector. */ const matches = []; let sibling_el = el.nextElementSibling; - while (!_.isNil(sibling_el) && !sibling_el.matches(selector)) { + while ((sibling_el instanceof Element) && !sibling_el.matches(selector)) { matches.push(sibling_el); sibling_el = sibling_el.nextElementSibling; } @@ -398,8 +392,8 @@ u.slideToggleElement = function (el, duration) { */ u.slideOut = function (el, duration=200) { return new Promise((resolve, reject) => { - if (_.isNil(el)) { - const err = "Undefined or null element passed into slideOut" + if (!el) { + const err = "An element needs to be passed in to slideOut" logger.warn(err); reject(new Error(err)); return; @@ -457,8 +451,8 @@ u.slideOut = function (el, duration=200) { u.slideIn = function (el, duration=200) { /* Hides/collapses an element by sliding it into itself. */ return new Promise((resolve, reject) => { - if (_.isNil(el)) { - const err = "Undefined or null element passed into slideIn"; + if (!el) { + const err = "An element needs to be passed in to slideIn"; logger.warn(err); return reject(new Error(err)); } else if (_.includes(el.classList, 'collapsed')) { @@ -518,8 +512,8 @@ u.isVisible = function (el) { u.fadeIn = function (el, callback) { - if (_.isNil(el)) { - logger.warn("Undefined or null element passed into fadeIn"); + if (!el) { + logger.warn("An element needs to be passed in to fadeIn"); } if (window.converse_disable_effects) { el.classList.remove('hidden'); @@ -561,7 +555,7 @@ u.xForm2webForm = function (field, stanza, options) { 'value': value, 'label': option.getAttribute('label'), 'selected': _.includes(values, value), - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }) } ); @@ -571,7 +565,7 @@ u.xForm2webForm = function (field, stanza, options) { 'label': field.getAttribute('label'), 'options': options.join(''), 'multiple': (field.getAttribute('type') === 'list-multi'), - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }); } else if (field.getAttribute('type') === 'fixed') { const text = _.get(field.querySelector('value'), 'textContent'); @@ -581,7 +575,7 @@ u.xForm2webForm = function (field, stanza, options) { 'name': field.getAttribute('var'), 'label': field.getAttribute('label') || '', 'value': _.get(field.querySelector('value'), 'textContent'), - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }); } else if (field.getAttribute('type') === 'boolean') { return tpl_form_checkbox({ @@ -589,7 +583,7 @@ u.xForm2webForm = function (field, stanza, options) { 'name': field.getAttribute('var'), 'label': field.getAttribute('label') || '', 'checked': _.get(field.querySelector('value'), 'textContent') === "1" && 'checked="1"' || '', - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }); } else if (field.getAttribute('var') === 'url') { return tpl_form_url({ @@ -603,7 +597,7 @@ u.xForm2webForm = function (field, stanza, options) { 'type': XFORM_TYPE_MAP[field.getAttribute('type')], 'label': field.getAttribute('label') || '', 'value': _.get(field.querySelector('value'), 'textContent'), - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }); } else if (field.getAttribute('var') === 'ocr') { // Captcha const uri = field.querySelector('uri'); @@ -613,7 +607,7 @@ u.xForm2webForm = function (field, stanza, options) { 'name': field.getAttribute('var'), 'data': _.get(el, 'textContent'), 'type': uri.getAttribute('type'), - 'required': !_.isNil(field.querySelector('required')) + 'required': !!field.querySelector('required') }); } else { const name = field.getAttribute('var'); @@ -624,7 +618,7 @@ u.xForm2webForm = function (field, stanza, options) { 'fixed_username': options.fixed_username, 'autocomplete': getAutoCompleteProperty(name, options), 'placeholder': null, - 'required': !_.isNil(field.querySelector('required')), + 'required': !!field.querySelector('required'), 'type': XFORM_TYPE_MAP[field.getAttribute('type')], 'value': _.get(field.querySelector('value'), 'textContent') });