eslint / 8.16.0 / rules / padding-line-between-statements.html /

padding-line-between-statements

The --fix option on the command line can automatically fix some of the problems reported by this rule.

Requires or disallows padding lines between statements.

This rule requires or disallows blank lines between the given 2 kinds of statements. Properly blank lines help developers to understand the code.

For example, the following configuration requires a blank line between a variable declaration and a return statement.

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: "var", next: "return" }
]*/

function foo() {
    var a = 1;

    return a;
}

Rule Details

This rule does nothing if no configurations are provided.

A configuration is an object which has 3 properties; blankLine, prev and next. For example, { blankLine: "always", prev: "var", next: "return" } means "one or more blank lines are required between a variable declaration and a return statement." You can supply any number of configurations. If a statement pair matches multiple configurations, the last matched configuration will be used.

{
    "padding-line-between-statements": [
        "error",
        { "blankLine": LINEBREAK_TYPE, "prev": STATEMENT_TYPE, "next": STATEMENT_TYPE },
        { "blankLine": LINEBREAK_TYPE, "prev": STATEMENT_TYPE, "next": STATEMENT_TYPE },
        { "blankLine": LINEBREAK_TYPE, "prev": STATEMENT_TYPE, "next": STATEMENT_TYPE },
        { "blankLine": LINEBREAK_TYPE, "prev": STATEMENT_TYPE, "next": STATEMENT_TYPE },
        ...
    ]
}
  • LINEBREAK_TYPE is one of the following.

    • "any" just ignores the statement pair.
    • "never" disallows blank lines.
    • "always" requires one or more blank lines. Note it does not count lines that comments exist as blank lines.
  • STATEMENT_TYPE is one of the following, or an array of the following.

    • "*" is wildcard. This matches any statements.
    • "block" is lonely blocks.
    • "block-like" is block like statements. This matches statements that the last token is the closing brace of blocks; e.g. { }, if (a) { }, and while (a) { }. Also matches immediately invoked function expression statements.
    • "break" is break statements.
    • "case" is case clauses in switch statements.
    • "cjs-export" is export statements of CommonJS; e.g. module.exports = 0, module.exports.foo = 1, and exports.foo = 2. This is a special case of assignment.
    • "cjs-import" is import statements of CommonJS; e.g. const foo = require("foo"). This is a special case of variable declarations.
    • "class" is class declarations.
    • "const" is const variable declarations, both single-line and multiline.
    • "continue" is continue statements.
    • "debugger" is debugger statements.
    • "default" is default clauses in switch statements.
    • "directive" is directive prologues. This matches directives; e.g. "use strict".
    • "do" is do-while statements. This matches all statements that the first token is do keyword.
    • "empty" is empty statements.
    • "export" is export declarations.
    • "expression" is expression statements.
    • "for" is for loop families. This matches all statements that the first token is for keyword.
    • "function" is function declarations.
    • "if" is if statements.
    • "iife" is immediately invoked function expression statements. This matches calls on a function expression, optionally prefixed with a unary operator.
    • "import" is import declarations.
    • "let" is let variable declarations, both single-line and multiline.
    • "multiline-block-like" is block like statements. This is the same as block-like type, but only if the block is multiline.
    • "multiline-const" is multiline const variable declarations.
    • "multiline-expression" is expression statements. This is the same as expression type, but only if the statement is multiline.
    • "multiline-let" is multiline let variable declarations.
    • "multiline-var" is multiline var variable declarations.
    • "return" is return statements.
    • "singleline-const" is single-line const variable declarations.
    • "singleline-let" is single-line let variable declarations.
    • "singleline-var" is single-line var variable declarations.
    • "switch" is switch statements.
    • "throw" is throw statements.
    • "try" is try statements.
    • "var" is var variable declarations, both single-line and multiline.
    • "while" is while loop statements.
    • "with" is with statements.

Examples

This configuration would require blank lines before all return statements, like the newline-before-return rule.

Examples of incorrect code for the [{ blankLine: "always", prev: "*", next: "return" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: "*", next: "return" }
]*/

function foo() {
    bar();
    return;
}

Examples of correct code for the [{ blankLine: "always", prev: "*", next: "return" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: "*", next: "return" }
]*/

function foo() {
    bar();

    return;
}

function foo() {
    return;
}

This configuration would require blank lines after every sequence of variable declarations, like the newline-after-var rule.

Examples of incorrect code for the [{ blankLine: "always", prev: ["const", "let", "var"], next: "*"}, { blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]}] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: ["const", "let", "var"], next: "*"},
    { blankLine: "any",    prev: ["const", "let", "var"], next: ["const", "let", "var"]}
]*/

function foo() {
    var a = 0;
    bar();
}

function foo() {
    let a = 0;
    bar();
}

function foo() {
    const a = 0;
    bar();
}

class C {
    static {
        let a = 0;
        bar();
    }
}

Examples of correct code for the [{ blankLine: "always", prev: ["const", "let", "var"], next: "*"}, { blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]}] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: ["const", "let", "var"], next: "*"},
    { blankLine: "any",    prev: ["const", "let", "var"], next: ["const", "let", "var"]}
]*/

function foo() {
    var a = 0;
    var b = 0;

    bar();
}

function foo() {
    let a = 0;
    const b = 0;

    bar();
}

function foo() {
    const a = 0;
    const b = 0;

    bar();
}

class C {
    static {
        let a = 0;
        let b = 0;

        bar();
    }
}

This configuration would require blank lines after all directive prologues, like the lines-around-directive rule.

Examples of incorrect code for the [{ blankLine: "always", prev: "directive", next: "*" }, { blankLine: "any", prev: "directive", next: "directive" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: "directive", next: "*" },
    { blankLine: "any",    prev: "directive", next: "directive" }
]*/

"use strict";
foo();

Examples of correct code for the [{ blankLine: "always", prev: "directive", next: "*" }, { blankLine: "any", prev: "directive", next: "directive" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: "directive", next: "*" },
    { blankLine: "any",    prev: "directive", next: "directive" }
]*/

"use strict";
"use asm";

foo();

This configuration would require blank lines between clauses in switch statements.

Examples of incorrect code for the [{ blankLine: "always", prev: ["case", "default"], next: "*" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: ["case", "default"], next: "*" }
]*/

switch (foo) {
    case 1:
        bar();
        break;
    case 2:
    case 3:
        baz();
        break;
    default:
        quux();
}

Examples of correct code for the [{ blankLine: "always", prev: ["case", "default"], next: "*" }] configuration:

/*eslint padding-line-between-statements: [
    "error",
    { blankLine: "always", prev: ["case", "default"], next: "*" }
]*/

switch (foo) {
    case 1:
        bar();
        break;

    case 2:

    case 3:
        baz();
        break;

    default:
        quux();
}

When Not To Use It

If you don't want to notify warnings about linebreaks, then it's safe to disable this rule.

Compatibility

Version

This rule was introduced in ESLint 4.0.0-beta.0.

Resources

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/rules/padding-line-between-statements