From 6b0a5823e34d3904dd9ae25161eec4ed8da69df7 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem Date: Sun, 8 Feb 2015 18:21:40 +0100 Subject: [PATCH] Add JSHint javascript linter --- Gemfile | 5 +- Gemfile.lock | 10 +++ app/assets/javascripts/app/app.js | 2 +- .../javascripts/app/helpers/truncate.js | 2 +- .../app/models/post/interactions.js | 4 +- app/assets/javascripts/app/models/stream.js | 2 +- app/assets/javascripts/app/views.js | 2 +- .../views/aspect_membership_blueprint_view.js | 6 +- .../app/views/aspect_membership_view.js | 4 +- .../javascripts/app/views/aspect_view.js | 2 +- .../app/views/aspects_dropdown_view.js | 2 +- .../app/views/aspects_list_view.js | 2 +- .../javascripts/app/views/contact_view.js | 2 +- .../javascripts/app/views/content_view.js | 6 +- .../javascripts/app/views/hovercard_view.js | 8 +- .../app/views/profile_header_view.js | 2 +- .../app/views/publisher/poll_creator_view.js | 2 +- .../app/views/publisher/uploader_view.js | 6 +- .../javascripts/app/views/publisher_view.js | 12 +-- .../single_post_moderation.js | 2 +- .../app/views/tag_following_list_view.js | 2 +- app/assets/javascripts/aspects-dropdown.js | 7 +- app/assets/javascripts/diaspora.js | 8 +- app/assets/javascripts/mobile/mobile.js | 4 +- .../mobile/mobile_file_uploader.js | 4 +- app/assets/javascripts/osmlocator.js | 2 +- .../pages/users-getting-started.js | 2 +- app/assets/javascripts/widgets/lightbox.js | 6 +- config/jshint.yml | 44 +++++++++++ .../app/helpers/text_formatter_spec.js | 4 +- spec/javascripts/app/models/photo_spec.js | 2 +- spec/javascripts/app/models/post_spec.js | 2 +- .../app/views/feedback_view_spec.js | 2 +- .../app/views/publisher_view_spec.js | 2 +- .../javascripts/app/views/stream_post_spec.js | 4 +- spec/javascripts/helpers/SpecHelper.js | 79 ++++++++++--------- spec/javascripts/helpers/factory.js | 12 --- spec/javascripts/helpers/mock-ajax.js | 6 +- 38 files changed, 166 insertions(+), 109 deletions(-) create mode 100644 config/jshint.yml diff --git a/Gemfile b/Gemfile index 9cbeeb992..8697a61b1 100644 --- a/Gemfile +++ b/Gemfile @@ -217,6 +217,9 @@ group :development do gem 'rb-fsevent', '0.9.4', :require => false gem 'rb-inotify', '0.9.5', :require => false + # Linters + gem 'jshint', '1.3.1' + # Preloading environment gem 'spring', '1.2.0' @@ -261,5 +264,5 @@ group :development, :test do # Jasmine (client side application tests (JS)) gem 'jasmine', '2.1.0' gem 'jasmine-jquery-rails', '2.0.3' - gem 'sinon-rails', '1.10.3' + gem 'sinon-rails', '1.10.3' end diff --git a/Gemfile.lock b/Gemfile.lock index b1da44a53..71b14c7ff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -308,12 +308,17 @@ GEM sprockets-rails js_image_paths (0.0.1) rails (~> 4.0) + jshint (1.3.1) + execjs (>= 1.4.0) + multi_json (~> 1.0) + therubyracer (~> 0.12.1) json (1.8.1) jwt (1.0.0) kaminari (0.16.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) kgio (2.9.2) + libv8 (3.16.14.7) listen (2.8.3) celluloid (>= 0.15.2) rb-fsevent (>= 0.9.3) @@ -488,6 +493,7 @@ GEM redis (3.1.0) redis-namespace (1.5.1) redis (~> 3.0, >= 3.0.4) + ref (1.0.5) remotipart (1.2.1) request_store (1.1.0) responders (1.1.2) @@ -569,6 +575,9 @@ GEM systemu (2.6.4) test_after_commit (0.4.0) activerecord (>= 3.2) + therubyracer (0.12.1) + libv8 (~> 3.16.14.0) + ref thor (0.19.1) thread_safe (0.3.4) tilt (1.4.1) @@ -658,6 +667,7 @@ DEPENDENCIES jquery-rails (= 3.1.2) js-routes (= 0.9.9) js_image_paths (= 0.0.1) + jshint (= 1.3.1) json (= 1.8.1) markerb (= 1.0.2) messagebus_ruby_api (= 1.0.3) diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js index 89a79031b..c353a3c99 100644 --- a/app/assets/javascripts/app/app.js +++ b/app/assets/javascripts/app/app.js @@ -70,7 +70,7 @@ var app = { }, setupDummyPreloads: function() { - if (window.gon == undefined) { + if (window.gon === undefined) { window.gon = {preloads:{}}; } }, diff --git a/app/assets/javascripts/app/helpers/truncate.js b/app/assets/javascripts/app/helpers/truncate.js index 122a259b7..7cfa6aa59 100644 --- a/app/assets/javascripts/app/helpers/truncate.js +++ b/app/assets/javascripts/app/helpers/truncate.js @@ -1,6 +1,6 @@ (function() { app.helpers.truncate = function(passedString, length) { - if (passedString == null || passedString == undefined) { + if (passedString === null || passedString === undefined) { return passedString; } diff --git a/app/assets/javascripts/app/models/post/interactions.js b/app/assets/javascripts/app/models/post/interactions.js index 5a157ef32..3c188188c 100644 --- a/app/assets/javascripts/app/models/post/interactions.js +++ b/app/assets/javascripts/app/models/post/interactions.js @@ -84,7 +84,7 @@ app.models.Post.Interactions = Backbone.Model.extend({ var self = this; this.comments.make(text).fail(function () { - flash = new Diaspora.Widgets.FlashMessages; + flash = new Diaspora.Widgets.FlashMessages(); flash.render({ success: false, notice: Diaspora.I18n.t("failed_to_post_message") @@ -101,7 +101,7 @@ app.models.Post.Interactions = Backbone.Model.extend({ reshare : function(){ var interactions = this , reshare = this.post.reshare() - , flash = new Diaspora.Widgets.FlashMessages; + , flash = new Diaspora.Widgets.FlashMessages(); reshare.save({}, { success : function(resp){ diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js index 2e0c1e799..54a51a747 100644 --- a/app/assets/javascripts/app/models/stream.js +++ b/app/assets/javascripts/app/models/stream.js @@ -42,7 +42,7 @@ app.models.Stream = Backbone.Collection.extend({ this.trigger("fetched", this); // all loaded? var respItems = this.items.parse(resp); - if(respItems && (respItems.author || respItems.length == 0)) { + if(respItems && (respItems.author || respItems.length === 0)) { this.trigger("allItemsLoaded", this); } }, diff --git a/app/assets/javascripts/app/views.js b/app/assets/javascripts/app/views.js index 9605dd966..a677e54d4 100644 --- a/app/assets/javascripts/app/views.js +++ b/app/assets/javascripts/app/views.js @@ -132,7 +132,7 @@ app.views.Base = Backbone.View.extend({ }) .fail(function() { self.$el.removeClass('deleting'); - var flash = new Diaspora.Widgets.FlashMessages; + var flash = new Diaspora.Widgets.FlashMessages(); flash.render({ success: false, notice: Diaspora.I18n.t('failed_to_remove') diff --git a/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js b/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js index cf0f59e2c..622ba3d7c 100644 --- a/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js +++ b/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js @@ -75,7 +75,7 @@ app.views.AspectMembershipBlueprint = Backbone.View.extend({ // the user didn't have this person in any aspects before, congratulate them // on their newly found friendship ;) - if( this.dropdown.find('li.selected').length == 0 ) { + if( this.dropdown.find('li.selected').length === 0 ) { var msg = Diaspora.I18n.t('aspect_dropdown.started_sharing_with', { 'name': this._name() }); Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg }); } @@ -121,7 +121,7 @@ app.views.AspectMembershipBlueprint = Backbone.View.extend({ // we just removed the last aspect, inform the user with a flash message // that he is no longer sharing with that person - if( this.dropdown.find('li.selected').length == 0 ) { + if( this.dropdown.find('li.selected').length === 0 ) { var msg = Diaspora.I18n.t('aspect_dropdown.stopped_sharing_with', { 'name': this._name() }); Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg }); } @@ -143,7 +143,7 @@ app.views.AspectMembershipBlueprint = Backbone.View.extend({ var aspects_cnt = this.dropdown.find('li.selected').length; var txt; - if( aspects_cnt == 0 ) { + if( aspects_cnt === 0 ) { btn.removeClass('in_aspects'); txt = Diaspora.I18n.t('aspect_dropdown.toggle.zero'); } else { diff --git a/app/assets/javascripts/app/views/aspect_membership_view.js b/app/assets/javascripts/app/views/aspect_membership_view.js index 8348f26b6..d22452421 100644 --- a/app/assets/javascripts/app/views/aspect_membership_view.js +++ b/app/assets/javascripts/app/views/aspect_membership_view.js @@ -75,7 +75,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({ // the user didn't have this person in any aspects before, congratulate them // on their newly found friendship ;) - if( this.dropdown.find('li.selected').length == 0 ) { + if( this.dropdown.find('li.selected').length === 0 ) { var msg = Diaspora.I18n.t('aspect_dropdown.started_sharing_with', { 'name': this._name() }); Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg }); } @@ -120,7 +120,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({ // we just removed the last aspect, inform the user with a flash message // that he is no longer sharing with that person - if( this.dropdown.find('li.selected').length == 0 ) { + if( this.dropdown.find('li.selected').length === 0 ) { var msg = Diaspora.I18n.t('aspect_dropdown.stopped_sharing_with', { 'name': this._name() }); Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg }); } diff --git a/app/assets/javascripts/app/views/aspect_view.js b/app/assets/javascripts/app/views/aspect_view.js index 982301370..4d986ee9d 100644 --- a/app/assets/javascripts/app/views/aspect_view.js +++ b/app/assets/javascripts/app/views/aspect_view.js @@ -12,7 +12,7 @@ app.views.Aspect = app.views.Base.extend({ }, toggleAspect: function(evt) { - if (evt) { evt.preventDefault(); }; + if (evt) { evt.preventDefault(); } this.model.toggleSelected(); app.router.aspects_stream(); diff --git a/app/assets/javascripts/app/views/aspects_dropdown_view.js b/app/assets/javascripts/app/views/aspects_dropdown_view.js index 65c5c8e00..c87ed275b 100644 --- a/app/assets/javascripts/app/views/aspects_dropdown_view.js +++ b/app/assets/javascripts/app/views/aspects_dropdown_view.js @@ -32,7 +32,7 @@ app.views.AspectsDropdown = app.views.Base.extend({ selectedAspects = this.$(".dropdown-menu > li.selected").length, buttonText; - if (selectedAspects == 0) { + if (selectedAspects === 0) { button.removeClass(inAspectClass).addClass('btn-default'); buttonText = Diaspora.I18n.t("aspect_dropdown.select_aspects"); } else { diff --git a/app/assets/javascripts/app/views/aspects_list_view.js b/app/assets/javascripts/app/views/aspects_list_view.js index 60416567c..61f671645 100644 --- a/app/assets/javascripts/app/views/aspects_list_view.js +++ b/app/assets/javascripts/app/views/aspects_list_view.js @@ -29,7 +29,7 @@ app.views.AspectsList = app.views.Base.extend({ }, toggleAll: function(evt) { - if (evt) { evt.preventDefault(); }; + if (evt) { evt.preventDefault(); } if (this.collection.allSelected()) { this.collection.deselectAll(); diff --git a/app/assets/javascripts/app/views/contact_view.js b/app/assets/javascripts/app/views/contact_view.js index 4fd2d7efb..297bec059 100644 --- a/app/assets/javascripts/app/views/contact_view.js +++ b/app/assets/javascripts/app/views/contact_view.js @@ -21,7 +21,7 @@ app.views.Contact = app.views.Base.extend({ postRenderTemplate: function() { var self = this; var dropdownEl = this.$('.aspect_membership_dropdown.placeholder'); - if( dropdownEl.length == 0 ) { + if( dropdownEl.length === 0 ) { return; } diff --git a/app/assets/javascripts/app/views/content_view.js b/app/assets/javascripts/app/views/content_view.js index f5e7061e5..71c641141 100644 --- a/app/assets/javascripts/app/views/content_view.js +++ b/app/assets/javascripts/app/views/content_view.js @@ -17,7 +17,7 @@ app.views.Content = app.views.Base.extend({ largePhoto : function() { var photos = this.model.get("photos") - if(!photos || photos.length == 0) { return } + if(!photos || photos.length === 0) { return } return photos[0] }, @@ -49,10 +49,10 @@ app.views.Content = app.views.Base.extend({ , oembed = elem.find(".oembed") , opengraph = elem.find(".opengraph") , addHeight = 0; - if($.trim(oembed.html()) != "") { + if($.trim(oembed.html()) !== "") { addHeight += oembed.height(); } - if($.trim(opengraph.html()) != "") { + if($.trim(opengraph.html()) !== "") { addHeight += opengraph.height(); } diff --git a/app/assets/javascripts/app/views/hovercard_view.js b/app/assets/javascripts/app/views/hovercard_view.js index 4cb5c6356..e4497b18a 100644 --- a/app/assets/javascripts/app/views/hovercard_view.js +++ b/app/assets/javascripts/app/views/hovercard_view.js @@ -41,7 +41,7 @@ app.views.Hovercard = app.views.Base.extend({ }, _mouseenterHandler: function(event) { - if( this.active == false || + if( this.active === false || $.contains(this.el, event.target) ) { return false; } var el = $(event.target); @@ -60,7 +60,7 @@ app.views.Hovercard = app.views.Base.extend({ }, _mouseleaveHandler: function(event) { - if( this.active == false || + if( this.active === false || $.contains(this.el, event.relatedTarget) ) { return false; } this.show_me = false; @@ -95,7 +95,7 @@ app.views.Hovercard = app.views.Base.extend({ var self = this; $.get(href, function(person){ - if( !person || person.length == 0 ) { + if( !person || person.length === 0 ) { throw new Error("received data is not a person object"); } @@ -123,7 +123,7 @@ app.views.Hovercard = app.views.Base.extend({ // TODO render me client side!!! var href = this.href(); href += "/aspect_membership_button"; - if(gon.bootstrap == true){ + if(gon.bootstrap === true){ href += "?bootstrap=true"; } $.get(href, function(response) { diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js index 35bcded56..e44300b29 100644 --- a/app/assets/javascripts/app/views/profile_header_view.js +++ b/app/assets/javascripts/app/views/profile_header_view.js @@ -43,7 +43,7 @@ app.views.ProfileHeader = app.views.Base.extend({ postRenderTemplate: function() { var self = this; var dropdownEl = this.$('.aspect_membership_dropdown.placeholder'); - if( dropdownEl.length == 0 ) { + if( dropdownEl.length === 0 ) { return; } diff --git a/app/assets/javascripts/app/views/publisher/poll_creator_view.js b/app/assets/javascripts/app/views/publisher/poll_creator_view.js index 3f49cbc17..45920b2c8 100644 --- a/app/assets/javascripts/app/views/publisher/poll_creator_view.js +++ b/app/assets/javascripts/app/views/publisher/poll_creator_view.js @@ -98,7 +98,7 @@ app.views.PublisherPollCreator = app.views.Base.extend({ // Validate the input unless it is the last one, or there are only the // question field and two options if( i !== inputs.length - 1 || inputs.length <= 3) { - if(_this.validateInput($(input)) == false) pollValid = false; + if(_this.validateInput($(input)) === false) pollValid = false; } }); diff --git a/app/assets/javascripts/app/views/publisher/uploader_view.js b/app/assets/javascripts/app/views/publisher/uploader_view.js index 39ef27433..302d6c335 100644 --- a/app/assets/javascripts/app/views/publisher/uploader_view.js +++ b/app/assets/javascripts/app/views/publisher/uploader_view.js @@ -66,7 +66,7 @@ app.views.PublisherUploader = Backbone.View.extend({ ); }, - uploadCompleteHandler: function(id, fileName, response) { + uploadCompleteHandler: function(_id, fileName, response) { if (response.success){ this.el_info.text(Diaspora.I18n.t('photo_uploader.completed', {file: fileName})).fadeTo(2000, 0); @@ -110,7 +110,7 @@ app.views.PublisherUploader = Backbone.View.extend({ .find('div.progress').remove(); // no more placeholders? enable buttons - if( publisher.el_photozone.find('li.loading').length == 0 ) { + if( publisher.el_photozone.find('li.loading').length === 0 ) { this.$el.removeClass('loading'); publisher.setButtonsEnabled(true); } @@ -139,7 +139,7 @@ app.views.PublisherUploader = Backbone.View.extend({ $.when(photo.fadeOut(400)).then(function(){ photo.remove(); - if( self.publisher.$('.publisher_photo').length == 0 ) { + if( self.publisher.$('.publisher_photo').length === 0 ) { // no more photos left... self.publisher.el_wrapper.removeClass('with_attachments'); } diff --git a/app/assets/javascripts/app/views/publisher_view.js b/app/assets/javascripts/app/views/publisher_view.js index 99f9e926e..79443d1ec 100644 --- a/app/assets/javascripts/app/views/publisher_view.js +++ b/app/assets/javascripts/app/views/publisher_view.js @@ -53,10 +53,10 @@ app.views.Publisher = Backbone.View.extend({ $(window).on('beforeunload', _.bind(this._beforeUnload, this)); // sync textarea content - if( this.el_hiddenInput.val() == "" ) { + if( this.el_hiddenInput.val() === "" ) { this.el_hiddenInput.val( this.el_input.val() ); } - if( this.el_input.val() == "" ) { + if( this.el_input.val() === "" ) { this.el_input.val( this.el_hiddenInput.val() ); } @@ -222,7 +222,7 @@ app.views.Publisher = Backbone.View.extend({ // creates the location showLocation: function(){ - if($('#location').length == 0){ + if($('#location').length === 0){ $('#location_container').append('
'); this.el_wrapper.addClass('with_location'); this.view_locator = new app.views.Location(); @@ -257,7 +257,7 @@ app.views.Publisher = Backbone.View.extend({ var serializedForm = $(evt.target).closest("form").serializeObject(); - var photos = new Array(); + var photos = []; $('li.publisher_photo img').each(function(){ var file = $(this).attr('src').substring("/uploads/images/".length); photos.push( @@ -271,7 +271,7 @@ app.views.Publisher = Backbone.View.extend({ ); }); - var mentioned_people = new Array(); + var mentioned_people = []; var regexp = new RegExp("@{\(\[\^\;\]\+\); \(\[\^\}\]\+\)}", "g"); while(user=regexp.exec(serializedForm["status_message[text]"])){ // user[1]: name, user[2]: handle @@ -289,7 +289,7 @@ app.views.Publisher = Backbone.View.extend({ var date = (new Date()).toISOString(); - var poll = undefined; + var poll; var poll_question = serializedForm["poll_question"]; var poll_answers_arry = _.flatten([serializedForm["poll_answers[]"]]); var poll_answers = _.map(poll_answers_arry, function(answer){ diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js index 4bece481a..15062c651 100644 --- a/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js +++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js @@ -35,7 +35,7 @@ app.views.SinglePostModeration = app.views.Feedback.extend({ document.location.href = "/stream"; }) .fail(function() { - var flash = new Diaspora.Widgets.FlashMessages; + var flash = new Diaspora.Widgets.FlashMessages(); flash.render({ success: false, notice: Diaspora.I18n.t('failed_to_remove') diff --git a/app/assets/javascripts/app/views/tag_following_list_view.js b/app/assets/javascripts/app/views/tag_following_list_view.js index d067b21df..a44f3e296 100644 --- a/app/assets/javascripts/app/views/tag_following_list_view.js +++ b/app/assets/javascripts/app/views/tag_following_list_view.js @@ -43,7 +43,7 @@ app.views.TagFollowingList = app.views.Base.extend({ this.$("input").bind('keydown', function(evt){ if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){ evt.preventDefault(); - if( $('li.as-result-item.active').length == 0 ){ + if( $('li.as-result-item.active').length === 0 ){ $('li.as-result-item').first().click(); } } diff --git a/app/assets/javascripts/aspects-dropdown.js b/app/assets/javascripts/aspects-dropdown.js index 99ce1fac0..fceb73af8 100644 --- a/app/assets/javascripts/aspects-dropdown.js +++ b/app/assets/javascripts/aspects-dropdown.js @@ -10,16 +10,17 @@ var AspectsDropdown = { selectedAspects = dropdown.children(".selected").length, allAspects = dropdown.children().length, replacement, + message, isInPublisher = dropdown.closest('#publisher').length; - if (number == 0) { + if (number === 0) { button.removeClass(inAspectClass); if (isInPublisher) { replacement = Diaspora.I18n.t("aspect_dropdown.select_aspects"); } else { replacement = Diaspora.I18n.t("aspect_dropdown.add_to_aspect"); /* flash message prompt */ - var message = Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", {name: dropdown.data('person-short-name')}); + message = Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", {name: dropdown.data('person-short-name')}); Diaspora.page.flashMessages.render({success: true, notice: message}); } } else if (selectedAspects == allAspects) { @@ -29,7 +30,7 @@ var AspectsDropdown = { replacement = dropdown.find(".selected").first().text(); /* flash message prompt */ if (!isInPublisher) { - var message = Diaspora.I18n.t("aspect_dropdown.started_sharing_with", {name: dropdown.data('person-short-name')}); + message = Diaspora.I18n.t("aspect_dropdown.started_sharing_with", {name: dropdown.data('person-short-name')}); Diaspora.page.flashMessages.render({success: true, notice: message}); } } else { diff --git a/app/assets/javascripts/diaspora.js b/app/assets/javascripts/diaspora.js index df60703f3..ea469b90f 100644 --- a/app/assets/javascripts/diaspora.js +++ b/app/assets/javascripts/diaspora.js @@ -21,14 +21,18 @@ var eventNames = eventName.split(" "); for(eventName in eventNames) { - this.eventsContainer.trigger(eventNames[eventName], args); + if(eventNames.hasOwnProperty(eventName)) { + this.eventsContainer.trigger(eventNames[eventName], args); + } } }, subscribe: function(eventName, callback, context) { var eventNames = eventName.split(" "); for(eventName in eventNames) { - this.eventsContainer.bind(eventNames[eventName], $.proxy(callback, context)); + if(eventNames.hasOwnProperty(eventName)) { + this.eventsContainer.bind(eventNames[eventName], $.proxy(callback, context)); + } } } }); diff --git a/app/assets/javascripts/mobile/mobile.js b/app/assets/javascripts/mobile/mobile.js index af1a3c336..6354b6bd2 100644 --- a/app/assets/javascripts/mobile/mobile.js +++ b/app/assets/javascripts/mobile/mobile.js @@ -247,8 +247,8 @@ $(document).ready(function(){ container.show(); } else { - var container = $("
"), - comments = $(""); + var comments = $(""); + container = $("
"); comments.html(data); container.append(comments); diff --git a/app/assets/javascripts/mobile/mobile_file_uploader.js b/app/assets/javascripts/mobile/mobile_file_uploader.js index ac17956c2..bd92d1c6b 100644 --- a/app/assets/javascripts/mobile/mobile_file_uploader.js +++ b/app/assets/javascripts/mobile/mobile_file_uploader.js @@ -35,7 +35,7 @@ function createUploader(){ ); }, - onComplete: function(id, fileName, responseJSON) { + onComplete: function(_id, fileName, responseJSON) { $('#fileInfo-publisher').text(Diaspora.I18n.t("photo_uploader.completed", {'file': fileName})); var id = responseJSON.data.photo.id, url = responseJSON.data.photo.unprocessed_image.url, @@ -67,7 +67,7 @@ function createUploader(){ success: function() { photo.fadeOut(400, function(){ photo.remove(); - if ( $('.publisher_photo').length == 0){ + if ( $('.publisher_photo').length === 0){ $('#publisher_textarea_wrapper').removeClass("with_attachments"); } }); diff --git a/app/assets/javascripts/osmlocator.js b/app/assets/javascripts/osmlocator.js index 8a36dedb3..9a7b59a93 100644 --- a/app/assets/javascripts/osmlocator.js +++ b/app/assets/javascripts/osmlocator.js @@ -16,7 +16,7 @@ OSM.Locator = function(){ function errorGettingPosition(err) { $("#location").remove(); - }; + } return { getAddress: geolocalize diff --git a/app/assets/javascripts/pages/users-getting-started.js b/app/assets/javascripts/pages/users-getting-started.js index fe4d0aa8a..d4f0954ce 100644 --- a/app/assets/javascripts/pages/users-getting-started.js +++ b/app/assets/javascripts/pages/users-getting-started.js @@ -75,7 +75,7 @@ Diaspora.Pages.UsersGettingStarted = function() { autocompleteInput.bind('keydown', function(evt){ if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){ evt.preventDefault(); - if( $('li.as-result-item.active').length == 0 ){ + if( $('li.as-result-item.active').length === 0 ){ $('li.as-result-item').first().click(); } } diff --git a/app/assets/javascripts/widgets/lightbox.js b/app/assets/javascripts/widgets/lightbox.js index df5bcb628..ef631c1f4 100644 --- a/app/assets/javascripts/widgets/lightbox.js +++ b/app/assets/javascripts/widgets/lightbox.js @@ -94,7 +94,7 @@ jQuery.fn.center = (function() { this.nextImage = function(thumb){ var next = thumb.next(); - if (next.length == 0) { + if (next.length === 0) { next = self.imageset.find("img").first(); } return(next); @@ -102,7 +102,7 @@ jQuery.fn.center = (function() { this.prevImage = function(thumb){ var prev = thumb.prev(); - if (prev.length == 0) { + if (prev.length === 0) { prev = self.imageset.find("img").last(); } return(prev); @@ -132,7 +132,7 @@ jQuery.fn.center = (function() { if(image.attr("data-full-photo") == imageUrl) { imageThumb = thumb; - }; + } self.imageset.append(thumb); }); diff --git a/config/jshint.yml b/config/jshint.yml new file mode 100644 index 000000000..e45c99b31 --- /dev/null +++ b/config/jshint.yml @@ -0,0 +1,44 @@ +files: ['**/*.js'] + +exclude_paths: [ + 'vendor/assets/javascripts', + 'lib/assets/javascripts' +] + +options: + # enforcing options + bitwise: false + camelcase: false + curly: false + eqeqeq: false + forin: true + freeze: true + immed: true + indent: 2 + latedef: nofunc + newcap: false + noarg: true + noempty: true + nonbsp: true + nonew: false + notypeof: true + undef: false + unused: false + + # relaxing options + asi: true + boss: true + eqnull: true + evil: true + expr: true + lastsemic: true + laxbreak: true + laxcomma: true + loopfunc: true + scripturl: true + sub: true + supernew: true + + globals: + jQuery: true + "$": true diff --git a/spec/javascripts/app/helpers/text_formatter_spec.js b/spec/javascripts/app/helpers/text_formatter_spec.js index c9f5750be..0e01004bf 100644 --- a/spec/javascripts/app/helpers/text_formatter_spec.js +++ b/spec/javascripts/app/helpers/text_formatter_spec.js @@ -73,7 +73,7 @@ describe("app.helpers.textFormatter", function(){ it('returns the name of the mention if the mention does not exist in the array', function(){ var text = "hey there @{Chris Smith; chris@example.com}" var formattedText = this.formatter(text, []) - expect(formattedText.match(/\