diff --git a/.jshintrc b/.jshintrc index 6ba9e06..0fbc069 100644 --- a/.jshintrc +++ b/.jshintrc @@ -7,7 +7,6 @@ "curly": true, "eqeqeq": true, "immed": true, - "indent": 2, "latedef": "nofunc", "newcap": true, "noarg": true, @@ -18,7 +17,11 @@ "strict": true, "trailing": true, "smarttabs": true, + "validthis": true, "globals": { - "angular": false + "angular": false, + "inject": false, + "Promise": false, + "URI": false } } diff --git a/Gruntfile.js b/Gruntfile.js index c5db946..b0fca9f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -32,42 +32,14 @@ module.exports = function(grunt) { */ grunt.initConfig({ jshint: { - options: { - //force: true, - globalstrict: true, - //sub: true, - node: true, - loopfunc: true, - browser: true, - devel: true, - globals: { - angular: true, - $: true, - moment: false, - Pikaday: false, - module: false, - forge: false - } - }, - beforeconcat: { - options: { - force: false, - ignores: ['**.min.js'] - }, - files: { - src: ['services/*.js', 'factories/*.js', 'values/*.js'] - } - }, - //quick version - will not fail entire grunt process if there are lint errors - beforeconcatQ: { - options: { - force: true, - ignores: ['**.min.js'] - }, - files: { - src: ['module.js, services/*.js', 'factories/*.js', 'values/*.js'] - } - } + options: { + force: true, + ignores: ['**.min.js'], + jshintrc: '.jshintrc' + }, + all: { + src: ['module.js', 'services/*.js', 'factories/*.js', 'values/*.js'] + } }, concat: { dist: { @@ -105,7 +77,7 @@ module.exports = function(grunt) { @toc 6. */ // Default task(s). - grunt.registerTask('default', ['jshint:beforeconcatQ', 'karma:unit', 'concat:dist']); + grunt.registerTask('default', ['jshint', 'karma:unit', 'concat:dist']); } init({}); //initialize here for defaults (init may be called again later within a task) diff --git a/factories/esDocFactory.js b/factories/esDocFactory.js index 4213ffa..4683763 100644 --- a/factories/esDocFactory.js +++ b/factories/esDocFactory.js @@ -58,7 +58,7 @@ /*jslint validthis:true*/ var self = this; - if (self.doc.hasOwnProperty("highlight")) { + if (self.doc.hasOwnProperty('highlight')) { var docHls = self.doc.highlight; if (docHls.hasOwnProperty(fieldName)) { return docHls[fieldName]; @@ -87,9 +87,9 @@ angular.forEach(fieldValue, function (value) { // Doing the naive thing and assuming that the highlight tags // were not overridden in the query DSL. - var preRegex = new RegExp("", 'g'); + var preRegex = new RegExp('', 'g'); var hlPre = value.replace(preRegex, preText); - var postRegex = new RegExp("", 'g'); + var postRegex = new RegExp('', 'g'); newValue.push(hlPre.replace(postRegex, postText)); }); diff --git a/factories/settingsValidatorFactory.js b/factories/settingsValidatorFactory.js index da6914c..9396d32 100644 --- a/factories/settingsValidatorFactory.js +++ b/factories/settingsValidatorFactory.js @@ -28,9 +28,9 @@ var args = { }; var fields = '*'; - if ( self.searchEngine == 'solr' ) { + if ( self.searchEngine === 'solr' ) { args = { q: ['*:*'] }; - } else if ( self.searchEngine == 'es' ) { + } else if ( self.searchEngine === 'es' ) { fields = null; } @@ -51,7 +51,7 @@ // the entire list of fields possible. // This is not perfect as the top 10 results might not include // a comprehensive list, but it's the best we can do. - if ( self.searchEngine == 'solr' ) { + if ( self.searchEngine === 'solr' ) { angular.forEach(self.searcher.docs, function(doc) { var attributes = Object.keys(doc.doc); @@ -59,8 +59,8 @@ return self.fields.indexOf(attribute) < 0; })); }); - } else if ( self.searchEngine == 'es' ) { - self.fields.push("_id"); + } else if ( self.searchEngine === 'es' ) { + self.fields.push('_id'); angular.forEach(self.searcher.docs, function(doc) { var attributes = Object.keys(doc.doc._source); diff --git a/services/esSearcherPreprocessorSvc.js b/services/esSearcherPreprocessorSvc.js index 07dad16..4cca6cf 100644 --- a/services/esSearcherPreprocessorSvc.js +++ b/services/esSearcherPreprocessorSvc.js @@ -7,7 +7,7 @@ angular.module('o19s.splainer-search') var replaceQuery = function(args, queryText) { if (queryText) { - queryText = queryText.replace(/\\/g, "\\\\");; + queryText = queryText.replace(/\\/g, '\\\\'); queryText = queryText.replace(/"/g, '\\\"'); } diff --git a/services/esUrlSvc.js b/services/esUrlSvc.js index 2e475b0..88f9962 100644 --- a/services/esUrlSvc.js +++ b/services/esUrlSvc.js @@ -52,7 +52,7 @@ angular.module('o19s.splainer-search') self.password = a.password(); self.parsed = true; - }; + } /** * @@ -116,7 +116,7 @@ angular.module('o19s.splainer-search') var url = self.protocol + '://' + self.host; - return url + return url; } function setParams (params) { @@ -126,7 +126,7 @@ angular.module('o19s.splainer-search') function UrlNotParseException() { var self = this; - self.message = "URL not parsed. Must call the parse() function first."; + self.message = 'URL not parsed. Must call the parse() function first.'; self.toString = function() { return self.message; }; diff --git a/services/fieldSpecSvc.js b/services/fieldSpecSvc.js index 5b320ac..59948ec 100644 --- a/services/fieldSpecSvc.js +++ b/services/fieldSpecSvc.js @@ -3,7 +3,7 @@ angular.module('o19s.splainer-search') .service('fieldSpecSvc', function fieldSpecSvc() { // AngularJS will instantiate a singleton by calling 'new' on this function - + var addFieldOfType = function(fieldSpec, fieldType, fieldName) { if (fieldType === 'sub') { if (!fieldSpec.hasOwnProperty('subs')) { @@ -11,7 +11,7 @@ angular.module('o19s.splainer-search') } if (fieldSpec.subs !== '*') { fieldSpec.subs.push(fieldName); - } + } if (fieldName === '*') { fieldSpec.subs = '*'; } @@ -47,8 +47,8 @@ angular.module('o19s.splainer-search') } }); }; - - + + var FieldSpec = function(fieldSpecStr) { this.fields = []; this.fieldSpecStr = fieldSpecStr; diff --git a/services/simExplainSvc.js b/services/simExplainSvc.js index 50e0ed4..2860c7e 100644 --- a/services/simExplainSvc.js +++ b/services/simExplainSvc.js @@ -25,7 +25,7 @@ angular.module('o19s.splainer-search') }); this.formulaStr = function() { - return 'TF=' + this.fieldWeight.tf().contribution() + + return 'TF=' + this.fieldWeight.tf().contribution() + ' * IDF=' + this.fieldWeight.idf().contribution(); }; }; @@ -44,7 +44,7 @@ angular.module('o19s.splainer-search') explain.tf = function() { return tfExpl; }; - + explain.idf = function() { return idfExpl; }; @@ -62,7 +62,7 @@ angular.module('o19s.splainer-search') /*this.fieldNorm = function() { };*/ }; - + this.QueryWeightExplain = function() { this.realExplanation = 'Query Weight'; tfIdfable(this); @@ -87,7 +87,7 @@ angular.module('o19s.splainer-search') // For default similarity, IDF of the term being searched // in the case of phrase queries, this is a sum of - // all the members of the phrase. + // all the members of the phrase. // // TODO -- the underlying idf for each member of a phrase // does not identify the term corresponding to that idf, diff --git a/services/solrUrlSvc.js b/services/solrUrlSvc.js index 55e0145..1fef6e4 100644 --- a/services/solrUrlSvc.js +++ b/services/solrUrlSvc.js @@ -146,22 +146,6 @@ angular.module('o19s.splainer-search') * */ this.removeUnsupported = function(solrArgs) { var warnings = {}; - var deleteThenWarn = function(arg, warning) { - if (solrArgs.hasOwnProperty(arg)) { - warnings[arg] = warning; - delete solrArgs[arg]; - } - }; - - var deleteThenWarnPrefix = function(argPrefix, warning) { - var argsCpy = angular.copy(solrArgs); - angular.forEach(argsCpy, function(value, key) { - if (key.startsWith(argPrefix)) { - deleteThenWarn(key, warning); - } - }); - }; - // Stuff I think we can safely remove without warning the user delete solrArgs['json.wrf']; delete solrArgs.facet; @@ -175,7 +159,6 @@ angular.module('o19s.splainer-search') delete solrArgs.debug; // Unsupported stuff to remove and provide a friendly warning - // deleteThenWarnPrefix('group', 'Group queries/field collapsing not supported'); return warnings; }; diff --git a/services/stringPatch.js b/services/stringPatch.js index 8f8c4e6..b86f4a2 100644 --- a/services/stringPatch.js +++ b/services/stringPatch.js @@ -2,7 +2,7 @@ if (typeof String.prototype.startsWith !== 'function') { // see below for better implementation! - String.prototype.startsWith = function (str){ + String.prototype.startsWith = function (str) { return this.indexOf(str) === 0; }; } @@ -15,6 +15,6 @@ if (typeof String.prototype.hasSubstr !== 'function') { if (typeof String.prototype.endsWith !== 'function') { String.prototype.endsWith = function(suffix) { - return this.indexOf(suffix, this.length - suffix.length) !== -1; + return this.indexOf(suffix, this.length - suffix.length) !== -1; }; } diff --git a/services/vectorSvc.js b/services/vectorSvc.js index 662e4c4..310abc2 100644 --- a/services/vectorSvc.js +++ b/services/vectorSvc.js @@ -66,6 +66,5 @@ angular.module('o19s.splainer-search') rVal.set(key, value * scalar); }); return rVal; - }; - + }; }); diff --git a/splainer-search.js b/splainer-search.js index a311cc3..b1be8a8 100644 --- a/splainer-search.js +++ b/splainer-search.js @@ -169,7 +169,7 @@ angular.module('o19s.splainer-search') var replaceQuery = function(args, queryText) { if (queryText) { - queryText = queryText.replace(/\\/g, "\\\\");; + queryText = queryText.replace(/\\/g, '\\\\'); queryText = queryText.replace(/"/g, '\\\"'); } @@ -251,7 +251,7 @@ angular.module('o19s.splainer-search') self.password = a.password(); self.parsed = true; - }; + } /** * @@ -315,7 +315,7 @@ angular.module('o19s.splainer-search') var url = self.protocol + '://' + self.host; - return url + return url; } function setParams (params) { @@ -325,7 +325,7 @@ angular.module('o19s.splainer-search') function UrlNotParseException() { var self = this; - self.message = "URL not parsed. Must call the parse() function first."; + self.message = 'URL not parsed. Must call the parse() function first.'; self.toString = function() { return self.message; }; @@ -471,7 +471,7 @@ angular.module('o19s.splainer-search') angular.module('o19s.splainer-search') .service('fieldSpecSvc', function fieldSpecSvc() { // AngularJS will instantiate a singleton by calling 'new' on this function - + var addFieldOfType = function(fieldSpec, fieldType, fieldName) { if (fieldType === 'sub') { if (!fieldSpec.hasOwnProperty('subs')) { @@ -479,7 +479,7 @@ angular.module('o19s.splainer-search') } if (fieldSpec.subs !== '*') { fieldSpec.subs.push(fieldName); - } + } if (fieldName === '*') { fieldSpec.subs = '*'; } @@ -515,8 +515,8 @@ angular.module('o19s.splainer-search') } }); }; - - + + var FieldSpec = function(fieldSpecStr) { this.fields = []; this.fieldSpecStr = fieldSpecStr; @@ -1138,7 +1138,7 @@ angular.module('o19s.splainer-search') }); this.formulaStr = function() { - return 'TF=' + this.fieldWeight.tf().contribution() + + return 'TF=' + this.fieldWeight.tf().contribution() + ' * IDF=' + this.fieldWeight.idf().contribution(); }; }; @@ -1157,7 +1157,7 @@ angular.module('o19s.splainer-search') explain.tf = function() { return tfExpl; }; - + explain.idf = function() { return idfExpl; }; @@ -1175,7 +1175,7 @@ angular.module('o19s.splainer-search') /*this.fieldNorm = function() { };*/ }; - + this.QueryWeightExplain = function() { this.realExplanation = 'Query Weight'; tfIdfable(this); @@ -1200,7 +1200,7 @@ angular.module('o19s.splainer-search') // For default similarity, IDF of the term being searched // in the case of phrase queries, this is a sum of - // all the members of the phrase. + // all the members of the phrase. // // TODO -- the underlying idf for each member of a phrase // does not identify the term corresponding to that idf, @@ -1451,22 +1451,6 @@ angular.module('o19s.splainer-search') * */ this.removeUnsupported = function(solrArgs) { var warnings = {}; - var deleteThenWarn = function(arg, warning) { - if (solrArgs.hasOwnProperty(arg)) { - warnings[arg] = warning; - delete solrArgs[arg]; - } - }; - - var deleteThenWarnPrefix = function(argPrefix, warning) { - var argsCpy = angular.copy(solrArgs); - angular.forEach(argsCpy, function(value, key) { - if (key.startsWith(argPrefix)) { - deleteThenWarn(key, warning); - } - }); - }; - // Stuff I think we can safely remove without warning the user delete solrArgs['json.wrf']; delete solrArgs.facet; @@ -1480,7 +1464,6 @@ angular.module('o19s.splainer-search') delete solrArgs.debug; // Unsupported stuff to remove and provide a friendly warning - // deleteThenWarnPrefix('group', 'Group queries/field collapsing not supported'); return warnings; }; @@ -1490,7 +1473,7 @@ angular.module('o19s.splainer-search') if (typeof String.prototype.startsWith !== 'function') { // see below for better implementation! - String.prototype.startsWith = function (str){ + String.prototype.startsWith = function (str) { return this.indexOf(str) === 0; }; } @@ -1503,7 +1486,7 @@ if (typeof String.prototype.hasSubstr !== 'function') { if (typeof String.prototype.endsWith !== 'function') { String.prototype.endsWith = function(suffix) { - return this.indexOf(suffix, this.length - suffix.length) !== -1; + return this.indexOf(suffix, this.length - suffix.length) !== -1; }; } @@ -1575,8 +1558,7 @@ angular.module('o19s.splainer-search') rVal.set(key, value * scalar); }); return rVal; - }; - + }; }); 'use strict'; @@ -1685,7 +1667,7 @@ angular.module('o19s.splainer-search') /*jslint validthis:true*/ var self = this; - if (self.doc.hasOwnProperty("highlight")) { + if (self.doc.hasOwnProperty('highlight')) { var docHls = self.doc.highlight; if (docHls.hasOwnProperty(fieldName)) { return docHls[fieldName]; @@ -1714,9 +1696,9 @@ angular.module('o19s.splainer-search') angular.forEach(fieldValue, function (value) { // Doing the naive thing and assuming that the highlight tags // were not overridden in the query DSL. - var preRegex = new RegExp("", 'g'); + var preRegex = new RegExp('', 'g'); var hlPre = value.replace(preRegex, preText); - var postRegex = new RegExp("", 'g'); + var postRegex = new RegExp('', 'g'); newValue.push(hlPre.replace(postRegex, postText)); }); @@ -2109,9 +2091,9 @@ angular.module('o19s.splainer-search') var args = { }; var fields = '*'; - if ( self.searchEngine == 'solr' ) { + if ( self.searchEngine === 'solr' ) { args = { q: ['*:*'] }; - } else if ( self.searchEngine == 'es' ) { + } else if ( self.searchEngine === 'es' ) { fields = null; } @@ -2132,7 +2114,7 @@ angular.module('o19s.splainer-search') // the entire list of fields possible. // This is not perfect as the top 10 results might not include // a comprehensive list, but it's the best we can do. - if ( self.searchEngine == 'solr' ) { + if ( self.searchEngine === 'solr' ) { angular.forEach(self.searcher.docs, function(doc) { var attributes = Object.keys(doc.doc); @@ -2140,8 +2122,8 @@ angular.module('o19s.splainer-search') return self.fields.indexOf(attribute) < 0; })); }); - } else if ( self.searchEngine == 'es' ) { - self.fields.push("_id"); + } else if ( self.searchEngine === 'es' ) { + self.fields.push('_id'); angular.forEach(self.searcher.docs, function(doc) { var attributes = Object.keys(doc.doc._source);