diff --git a/.eslintrc b/.eslintrc index 6700edd..148f857 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,14 +1,18 @@ { + // eslint: recommended automatically enables most/all rules from the + // possible errors section and more: + // http://eslint.org/docs/rules/#possible-errors + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 6 + }, "env": { "browser": false, "node": true, - "es6": true }, "rules": { // possible errors - "comma-dangle": [ 2 ], "no-cond-assign": [ 2 ], - "no-console": [ 2 ], "no-constant-condition": [ 2 ], "no-control-regex": [ 2 ], "no-debugger": [ 2 ], @@ -21,27 +25,23 @@ "no-extra-boolean-cast": [ 2 ], "no-extra-semi": [ 2 ], "no-func-assign": [ 2 ], - // this is for variable hoisting, not necessary if we use block scoped declarations - // "no-inner-declarations": [ 2, "both" ], "no-invalid-regexp": [ 2 ], "no-irregular-whitespace": [ 2 ], "no-negated-in-lhs": [ 2 ], - // when IE8 dies "no-reserved-keys": [ 0 ], "no-regex-spaces": [ 2 ], "no-sparse-arrays": [ 2 ], "no-unreachable": [ 2 ], "use-isnan": [ 2 ], - // should we enforce valid documentation comments? - // i.e., if you do documentation, do it right + "valid-typeof": [ 2 ], "valid-jsdoc": [ 2, { - "requireReturnDescription": false, + "requireReturnDescription": false }], - "valid-typeof": [ 2 ], // best practices + "array-callback-return": [ 2 ], "block-scoped-var": [ 2 ], - // warning for now until we get them fixed + "complexity": [ 1 ], "consistent-return": [ 2 ], "curly": [ 2 ], "default-case": [ 2 ], @@ -50,18 +50,24 @@ "guard-for-in": [ 2 ], "no-alert": [ 2 ], "no-caller": [ 2 ], + "no-case-declarations": [ 2 ], "no-div-regex": [ 2 ], + "no-empty-function": [ 2 ], + "no-empty-pattern": [ 2 ], "no-eq-null": [ 2 ], "no-eval": [ 2 ], "no-extend-native": [ 2 ], "no-extra-bind": [ 2 ], + "no-extra-label": [ 2 ], "no-fallthrough": [ 2 ], "no-floating-decimal": [ 2 ], + "no-implicit-coercion": [ 2 ], "no-implied-eval": [ 2 ], "no-iterator": [ 2 ], "no-labels": [ 2 ], "no-lone-blocks": [ 2 ], "no-loop-func": [ 2 ], + "no-magic-numbers": [ 0 ], "no-multi-spaces": [ 0 ], "no-native-reassign": [ 2 ], "no-new": [ 2 ], @@ -69,20 +75,25 @@ "no-new-wrappers": [ 2 ], "no-octal": [ 2 ], "no-octal-escape": [ 2 ], - // "no-param-reassign": [ 2 ], + "no-param-reassign": [ 2 ], "no-proto": [ 2 ], "no-redeclare": [ 2 ], "no-return-assign": [ 2 ], "no-script-url": [ 2 ], + "no-self-assign": [ 2 ], "no-self-compare": [ 2 ], "no-sequences": [ 2 ], "no-throw-literal": [ 2 ], + "no-unmodified-loop-condition": [ 2 ], "no-unused-expressions": [ 2 ], + "no-unused-labels": [ 2 ], + "no-useless-call": [ 2 ], + "no-useless-concat": [ 2 ], "no-void": [ 2 ], + "no-warning-comments": [ 1 ], "no-with": [ 2 ], - // "vars-on-top": [ 2 ], "wrap-iife": [ 2 ], - "yoda": [ 0 ], + "yoda": [ 2, "never" ], // strict mode "strict": [ 2, "global" ], @@ -94,29 +105,32 @@ "no-shadow-restricted-names": [ 2 ], "no-undef": [ 2 ], "no-undef-init": [ 2 ], - "no-undefined": [ 0 ], + "no-undefined": [ 2 ], "no-unused-vars": [ 2, { "vars": "all", "args": "none" } ], "no-use-before-define": [ 2, "nofunc" ], // node.js + "callback-return": [ 2, [ "callback", "cb", "cb1", "cb2", "cb3", "next", "innerCb", "done" ]], + "global-require": [ 2 ], "handle-callback-err": [ 2, "^.*(e|E)rr" ], "no-mixed-requires": [ 2 ], "no-new-require": [ 2 ], - "no-restricted-modules": [ 2, "" ], + "no-path-concat": [ 2 ], "no-process-exit": [ 0 ], - // ES6 - "generator-star-spacing": [ 2, "after" ], - // stylistic - "camelcase": [ 2, { "properties": "never" } ], - "eol-last": [ 0 ], - "key-spacing": [ 0 ], - "no-mixed-spaces-and-tabs": [ 2, "smart-tabs" ], + // turn on the few on that aren't handled by JSCS. + "consistent-this": [ 2, "self" ], + "no-array-constructor": [ 2 ], "no-nested-ternary": [ 2 ], - "no-underscore-dangle": [ 0 ], - "semi": [ 2, "always" ], - "space-infix-ops": [ 2 ], - "quotes": [ 0 ] + "no-new-object": [ 2 ], + + // es6 + "no-class-assign": [ 2 ], + "no-dupe-class-members": [ 2 ], + "no-new-symbol": [ 2 ], + "no-const-assign": [ 2 ], + "no-var": [ 2 ], + "prefer-const": [ 2 ] } } diff --git a/lib/bind.js b/lib/bind.js index 81e36a0..c498409 100644 --- a/lib/bind.js +++ b/lib/bind.js @@ -1,7 +1,7 @@ 'use strict'; // external modules -var assert = require('assert-plus'); +const assert = require('assert-plus'); /** @@ -22,9 +22,9 @@ function bind(fn, context, args) { // working with arguments is a bit hazardous in terms of deopt. // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments - var partialArgs = new Array(arguments.length); + const partialArgs = new Array(arguments.length); - for (var i = 0; i < partialArgs.length; i++) { + for (let i = 0; i < partialArgs.length; i++) { partialArgs[i] = arguments[i]; } diff --git a/lib/index.js b/lib/index.js index c57a7f0..a7e2227 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,14 +1,14 @@ 'use strict'; // core modules -var events = require('events'); -var util = require('util'); +const events = require('events'); +const util = require('util'); // external modules -var assert = require('assert-plus'); +const assert = require('assert-plus'); // internal files -var bind = require('./bind'); +const bind = require('./bind'); //------------------------------------------------------------------------------ @@ -40,11 +40,11 @@ function Reissue(opts) { assert.optionalNumber(opts.timeout, 'timeout'); // assert options of different types - var typeofInterval = typeof opts.interval; + const typeofInterval = typeof opts.interval; assert.equal(typeofInterval === 'function' || typeofInterval === 'number', true); - var self = this; + const self = this; //-------------------------------------------------------------------------- // user supplied properties @@ -76,7 +76,7 @@ function Reissue(opts) { * arguments to pass to the function. append the internal done callback. * @type {Array} */ - var boundDone = bind(self._done, self); + const boundDone = bind(self._done, self); self._funcArgs = (opts.args) ? opts.args.concat(boundDone) : [boundDone]; @@ -142,7 +142,7 @@ util.inherits(Reissue, events.EventEmitter); */ Reissue.prototype._execute = function _execute() { - var self = this; + const self = this; // start invocation timer self._startTime = Date.now(); @@ -181,9 +181,9 @@ Reissue.prototype._execute = function _execute() { Reissue.prototype._done = function _done(err) { // calculate delta interval - var self = this; - var interval = self._interval(); - var elapsedTime = Date.now() - self._startTime; + const self = this; + const interval = self._interval(); + const elapsedTime = Date.now() - self._startTime; // we're out of user supplied func now self._inUserFunc = false; @@ -218,7 +218,7 @@ Reissue.prototype._done = function _done(err) { // the interval, which means the last execution took longer than // the interval itself. otherwise, subtract the time the previous // invocation took. - var timeToInvocation = (elapsedTime >= interval) ? + const timeToInvocation = (elapsedTime >= interval) ? 0 : (interval - elapsedTime); self._nextHandlerId = setTimeout(function _nextInvocation() { @@ -238,7 +238,7 @@ Reissue.prototype._done = function _done(err) { */ Reissue.prototype._stop = function _stop() { - var self = this; + const self = this; // clear the next invocation if one exists if (self._nextHandlerId) { @@ -265,7 +265,7 @@ Reissue.prototype._stop = function _stop() { */ Reissue.prototype._onTimeout = function _onTimeout() { - var self = this; + const self = this; // we might have called stop during current invocation. emit timeout event // only if we're still active. @@ -290,8 +290,8 @@ Reissue.prototype.start = function start(delay) { assert.optionalNumber(delay); - var self = this; - var realDelay = (typeof delay === 'number' && delay >= 0) ? delay : 0; + const self = this; + const realDelay = (typeof delay === 'number' && delay >= 0) ? delay : 0; // before starting, see if reissue is already active. if so, throw an // error. @@ -316,7 +316,7 @@ Reissue.prototype.start = function start(delay) { */ Reissue.prototype.stop = function stop() { - var self = this; + const self = this; // NOTE: while the below if statements could be collapsed to be more more // terse, this logic is easier to read in terms of maintainability. diff --git a/test/index.js b/test/index.js index 556f909..4f13711 100644 --- a/test/index.js +++ b/test/index.js @@ -3,11 +3,11 @@ 'use strict'; // external modules -var chai = require('chai'); -var assert = chai.assert; +const chai = require('chai'); +const assert = chai.assert; // internal files -var reissue = require('../lib'); +const reissue = require('../lib'); describe('Reissue module', function() { @@ -16,10 +16,10 @@ describe('Reissue module', function() { it('should emulate setInterval', function(done) { - var out = []; - var i = 0; + let i = 0; - var timer = reissue.create({ + const out = []; + const timer = reissue.create({ func: function(callback) { out.push(i); i += 1; @@ -38,11 +38,11 @@ describe('Reissue module', function() { it('should accept arguments', function(done) { - var out = []; - var i = 0; - var fooStr = 'hello'; + let i = 0; - var timer = reissue.create({ + const out = []; + const fooStr = 'hello'; + const timer = reissue.create({ func: function(argStr, acc, callback) { // assert that args were injected assert.equal(argStr, fooStr); @@ -68,16 +68,16 @@ describe('Reissue module', function() { it('should accept context and arguments', function(done) { - var out = ''; - var i = 0; - var fooStr = 'random string'; - var foo = { + let i = 0; + let out = ''; + + const fooStr = 'hello'; + const foo = { printHi: function printHi() { out += 'hi'; } }; - - var timer = reissue.create({ + const timer = reissue.create({ func: function(argStr, callback) { i++; @@ -109,9 +109,9 @@ describe('Reissue module', function() { it('should stop queue using stop()', function(done) { - var i = 0; + let i = 0; - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { i++; @@ -134,10 +134,10 @@ describe('Reissue module', function() { it('should use dynamic intervals', function(done) { - var startTime = Date.now(); - var i = 0; + let i = 0; - var timer = reissue.create({ + const startTime = Date.now(); + const timer = reissue.create({ func: function(callback) { // each time we're called, increase i, which will @@ -148,7 +148,7 @@ describe('Reissue module', function() { // (1 *100) + (2 * 100) + (3 * 100) + (4 * 100) for a total of // 100 + 200 + 300 + 400 = 1000ms if (i === 5) { - var elapsed = Date.now() - startTime; + const elapsed = Date.now() - startTime; assert.equal(elapsed >= 1000, true); return done(); } @@ -164,10 +164,10 @@ describe('Reissue module', function() { it('should handle decreasing intervals', function(done) { - var startTime = Date.now(); - var i = 5; + let i = 5; - var timer = reissue.create({ + const startTime = Date.now(); + const timer = reissue.create({ func: function(callback) { // each time we're called, decrease the interval @@ -177,7 +177,7 @@ describe('Reissue module', function() { // (1 *100) + (2 * 100) + (3 * 100) + (4 * 100) for a total of // 100 + 200 + 300 + 400 = 1000ms if (i === 0) { - var elapsed = Date.now() - startTime; + const elapsed = Date.now() - startTime; assert.equal(elapsed >= 1000, true); return done(); } @@ -193,10 +193,10 @@ describe('Reissue module', function() { it('should emit error', function(done) { - var i = 0; - var errFired = false; + let i = 0; + let errFired = false; - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { i++; @@ -228,17 +228,17 @@ describe('Reissue module', function() { it('should emit error with context and args', function(done) { - var out = ''; - var i = 0; - var fooStr = 'random string'; - var foo = { + let i = 0; + let errFired = false; + let out = ''; + + const fooStr = 'random string'; + const foo = { printHi: function printHi() { out += 'hi'; } }; - var errFired = false; - - var timer = reissue.create({ + const timer = reissue.create({ func: function(argStr, callback) { i++; @@ -284,10 +284,10 @@ describe('Reissue module', function() { it('should throw when start() called multiple times', function(done) { - var out = []; - var i = 0; + let i = 0; - var timer = reissue.create({ + const out = []; + const timer = reissue.create({ func: function(callback) { out.push(i); i += 1; @@ -313,11 +313,11 @@ describe('Reissue module', function() { it('should start after arbitrary delay', function(done) { - var startTime = Date.now(); - var out = []; - var i = 0; + const startTime = Date.now(); + const out = []; + let i = 0; - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { out.push(i); @@ -344,9 +344,9 @@ describe('Reissue module', function() { it('should not execute first invocation if stop was called', function(done) { - var fired = false; + let fired = false; - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { fired = true; return callback(); @@ -365,7 +365,7 @@ describe('Reissue module', function() { it('should emit stop event if reissue is inactive', function(done) { - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { return callback(); }, @@ -377,9 +377,11 @@ describe('Reissue module', function() { it('should emit stop, cancelling next invocation', function(done) { - var out = []; - var i = 0; - var timer = reissue.create({ + + let i = 0; + + const out = []; + const timer = reissue.create({ func: function(callback) { out.push(i++); return setTimeout(callback, 400); @@ -403,10 +405,10 @@ describe('Reissue module', function() { it('should emit stop, never schedules next invocation', function(done) { - var out = []; - var i = 0; + let i = 0; - var timer = reissue.create({ + const out = []; + const timer = reissue.create({ func: function(callback) { out.push(i++); @@ -437,9 +439,10 @@ describe('Reissue module', function() { it('should emit timeout event', function(done) { - var callCount = 0; - var timeoutFired = false; - var timer = reissue.create({ + let callCount = 0; + let timeoutFired = false; + + const timer = reissue.create({ func: function(callback) { callCount++; return setTimeout(callback, 300); @@ -470,9 +473,10 @@ describe('Reissue module', function() { it('should stop during invocation, and timeout event should not fire', function(done) { - var callCount = 0; - var timeoutFired = false; - var timer = reissue.create({ + let callCount = 0; + let timeoutFired = false; + + const timer = reissue.create({ func: function(callback) { callCount++; return setTimeout(callback, 250); @@ -504,7 +508,7 @@ describe('Reissue module', function() { it('call stop during invocation, and timeout fires before invocation ' + 'completes', function(done) { - var timer = reissue.create({ + const timer = reissue.create({ func: function(callback) { return setTimeout(callback, 250); },