lib/middleware/controllers.js

Summary

Maintainability
B
6 hrs
Test Coverage

Function initialize has 98 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  * initialize(next) {
    yield * next;
    logger("using leafjs controller middleware");
    let leaf = this;
    let koa = leaf.koa;
Severity: Major
Found in lib/middleware/controllers.js - About 3 hrs to fix

    Function initialize has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.
    Open

      * initialize(next) {
        yield * next;
        logger("using leafjs controller middleware");
        let leaf = this;
        let koa = leaf.koa;
    Severity: Minor
    Found in lib/middleware/controllers.js - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Unexpected require().
    Open

      handlers = require(path);
    Severity: Minor
    Found in lib/middleware/controllers.js by eslint

    Enforce require() on the top-level module scope (global-require)

    In Node.js, module dependencies are included using the require() function, such as:

    var fs = require("fs");

    While require() may be called anywhere in code, some style guides prescribe that it should be called only in the top level of a module to make it easier to identify dependencies. For instance, it's arguably harder to identify dependencies when they are deeply nested inside of functions and other statements:

    function foo() {
    
        if (condition) {
            var fs = require("fs");
        }
    }

    Since require() does a synchronous load, it can cause performance problems when used in other locations.

    Further, ES6 modules mandate that import and export statements can only occur in the top level of the module's body.

    Rule Details

    This rule requires all calls to require() to be at the top level of the module, similar to ES6 import and export statements, which also can occur only at the top level.

    Examples of incorrect code for this rule:

    /*eslint global-require: "error"*/
    /*eslint-env es6*/
    
    // calling require() inside of a function is not allowed
    function readFile(filename, callback) {
        var fs = require('fs');
        fs.readFile(filename, callback)
    }
    
    // conditional requires like this are also not allowed
    if (DEBUG) { require('debug'); }
    
    // a require() in a switch statement is also flagged
    switch(x) { case '1': require('1'); break; }
    
    // you may not require() inside an arrow function body
    var getModule = (name) => require(name);
    
    // you may not require() inside of a function body as well
    function getModule(name) { return require(name); }
    
    // you may not require() inside of a try/catch block
    try {
        require(unsafeModule);
    } catch(e) {
        console.log(e);
    }

    Examples of correct code for this rule:

    /*eslint global-require: "error"*/
    
    // all these variations of require() are ok
    require('x');
    var y = require('y');
    var z;
    z = require('z').initialize();
    
    // requiring a module and using it in a function is ok
    var fs = require('fs');
    function readFile(filename, callback) {
        fs.readFile(filename, callback)
    }
    
    // you can use a ternary to determine which module to require
    var logger = DEBUG ? require('dev-logger') : require('logger');
    
    // if you want you can require() at the end of your module
    function doSomethingA() {}
    function doSomethingB() {}
    var x = require("x"),
        z = require("z");

    When Not To Use It

    If you have a module that must be initialized with information that comes from the file-system or if a module is only used in very rare situations and will cause significant overhead to load it may make sense to disable the rule. If you need to require() an optional dependency inside of a try/catch, you can disable this rule for just that dependency using the // eslint-disable-line global-require comment. Source: http://eslint.org/docs/rules/

    Move the invocation into the parens that contain the function.
    Open

              (function(fn, val) {
    Severity: Minor
    Found in lib/middleware/controllers.js by eslint

    Require IIFEs to be Wrapped (wrap-iife)

    You can immediately invoke function expressions, but not function declarations. A common technique to create an immediately-invoked function expression (IIFE) is to wrap a function declaration in parentheses. The opening parentheses causes the contained function to be parsed as an expression, rather than a declaration.

    // function expression could be unwrapped
    var x = function () { return { y: 1 };}();
    
    // function declaration must be wrapped
    function () { /* side effects */ }(); // SyntaxError

    Rule Details

    This rule requires all immediately-invoked function expressions to be wrapped in parentheses.

    Options

    This rule has two options, a string option and an object option.

    String option:

    • "outside" enforces always wrapping the call expression. The default is "outside".
    • "inside" enforces always wrapping the function expression.
    • "any" enforces always wrapping, but allows either style.

    Object option:

    • "functionPrototypeMethods": true additionally enforces wrapping function expressions invoked using .call and .apply. The default is false.

    outside

    Examples of incorrect code for the default "outside" option:

    /*eslint wrap-iife: ["error", "outside"]*/
    
    var x = function () { return { y: 1 };}(); // unwrapped
    var x = (function () { return { y: 1 };})(); // wrapped function expression

    Examples of correct code for the default "outside" option:

    /*eslint wrap-iife: ["error", "outside"]*/
    
    var x = (function () { return { y: 1 };}()); // wrapped call expression

    inside

    Examples of incorrect code for the "inside" option:

    /*eslint wrap-iife: ["error", "inside"]*/
    
    var x = function () { return { y: 1 };}(); // unwrapped
    var x = (function () { return { y: 1 };}()); // wrapped call expression

    Examples of correct code for the "inside" option:

    /*eslint wrap-iife: ["error", "inside"]*/
    
    var x = (function () { return { y: 1 };})(); // wrapped function expression

    any

    Examples of incorrect code for the "any" option:

    /*eslint wrap-iife: ["error", "any"]*/
    
    var x = function () { return { y: 1 };}(); // unwrapped

    Examples of correct code for the "any" option:

    /*eslint wrap-iife: ["error", "any"]*/
    
    var x = (function () { return { y: 1 };}()); // wrapped call expression
    var x = (function () { return { y: 1 };})(); // wrapped function expression

    functionPrototypeMethods

    Examples of incorrect code for this rule with the "inside", { "functionPrototypeMethods": true } options:

    /* eslint wrap-iife: [2, "inside", { functionPrototypeMethods: true }] */
    
    var x = function(){ foo(); }()
    var x = (function(){ foo(); }())
    var x = function(){ foo(); }.call(bar)
    var x = (function(){ foo(); }.call(bar))

    Examples of correct code for this rule with the "inside", { "functionPrototypeMethods": true } options:

    /* eslint wrap-iife: [2, "inside", { functionPrototypeMethods: true }] */
    
    var x = (function(){ foo(); })()
    var x = (function(){ foo(); }).call(bar)

    Source: http://eslint.org/docs/rules/

    The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype.
    Open

          for (let key in keysMap) {
    Severity: Minor
    Found in lib/middleware/controllers.js by eslint

    Require Guarding for-in (guard-for-in)

    Looping over objects with a for in loop will include properties that are inherited through the prototype chain. This behavior can lead to unexpected items in your for loop.

    for (key in foo) {
        doSomething(key);
    }

    Note that simply checking foo.hasOwnProperty(key) is likely to cause an error in some cases; see [no-prototype-builtins](no-prototype-builtins.md).

    Rule Details

    This rule is aimed at preventing unexpected behavior that could arise from using a for in loop without filtering the results in the loop. As such, it will warn when for in loops do not filter their results with an if statement.

    Examples of incorrect code for this rule:

    /*eslint guard-for-in: "error"*/
    
    for (key in foo) {
        doSomething(key);
    }

    Examples of correct code for this rule:

    /*eslint guard-for-in: "error"*/
    
    for (key in foo) {
        if (Object.prototype.hasOwnProperty.call(foo, key)) {
            doSomething(key);
        }
        if ({}.hasOwnProperty.call(foo, key)) {
            doSomething(key);
        }
    }

    Related Rules

    • [no-prototype-builtins](no-prototype-builtins.md)

    Further Reading

    Do not use 'new' for side effects.
    Open

                  new leaf.controllers[name](leaf, debug([leaf._config.name, "controller", name].join(':')));
    Severity: Minor
    Found in lib/middleware/controllers.js by eslint

    Disallow new For Side Effects (no-new)

    The goal of using new with a constructor is typically to create an object of a particular type and store that object in a variable, such as:

    var person = new Person();

    It's less common to use new and not store the result, such as:

    new Person();

    In this case, the created object is thrown away because its reference isn't stored anywhere, and in many cases, this means that the constructor should be replaced with a function that doesn't require new to be used.

    Rule Details

    This rule is aimed at maintaining consistency and convention by disallowing constructor calls using the new keyword that do not assign the resulting object to a variable.

    Examples of incorrect code for this rule:

    /*eslint no-new: "error"*/
    
    new Thing();

    Examples of correct code for this rule:

    /*eslint no-new: "error"*/
    
    var thing = new Thing();
    
    Thing();

    Source: http://eslint.org/docs/rules/

    There are no issues that match your filters.

    Category
    Status