Spec-Zone.ru › ESLint

Отступ

Принудительно обеспечить согласованный отступ

🔧 Исправимые

Некоторые проблемы, обнаруженные этим правилом, автоматически исправляются с помощью опции командной строки --fix командной строки

Это правило было устаревшим в ESLint v8.53.0. Пожалуйста, используйте соответствующее правило в @stylistic/eslint-plugin-js.

Существует несколько общих руководств, которые требуют определенного отступа вложенных блоков и инструкций, таких как:

function hello(indentSize, type) {
    if (indentSize === 4 && type !== 'tab') {
        console.log('Each next indentation will increase on 4 spaces');
    }
}

Это наиболее распространенные сценарии, рекомендуемые в различных руководствах по стилю:

  • Два пробела, не более, без табуляции: Google, npm, Node.js, Idiomatic, Felix
  • Табуляция: jQuery
  • Четыре пробела: Crockford

Подробное описание правила

Это правило навязывает согласованный стиль отступа. По умолчанию используется стиль 4 spaces.

Опции

Это правило имеет смешанную опцию:

Например, для отступа в 2 пробела:

{
    "indent": ["error", 2]
}

Или для отступа с табуляцией:

{
    "indent": ["error", "tab"]
}

Примеры некорректного кода для этого правила с опциями по умолчанию:

Открыть в игровом поле
/*eslint indent: "error"*/

if (a) {
b=c;
function foo(d) {
e=f;
}
}

Примеры корректного кода для этого правила с опциями по умолчанию:

Открыть в игровом поле
/*eslint indent: "error"*/

if (a) {
    b=c;
    function foo(d) {
        e=f;
    }
}

Это правило имеет опцию объекта:

  • "ignoredNodes" может использоваться для отключения проверки отступа для любого узла AST. Это принимает массив селекторов. Если узел AST соответствует любому из селекторов, отступ токенов, которые являются непосредственными дочерними элементами этого узла, будет проигнорирован. Это может быть использовано как отступ, чтобы ослабить правило, если вы не согласны с отступом, который оно навязывает для определенного синтаксического паттерна.
  • "SwitchCase" (по умолчанию: 0) навязывает уровень отступа для case в switch инструкциях
  • "VariableDeclarator" (по умолчанию: 1) навязывает уровень отступа для var деклараторов; также может принимать объект для определения отдельных правил для var, let и const объявлений. Также может быть "first", что указывает на то, что все деклараторы должны быть выровнены с первым декларатором.
  • "outerIIFEBody" (по умолчанию: 1) навязывает уровень отступа для IIFE на уровне файла. Это также может быть установлено на "off", чтобы отключить проверку для IIFE на уровне файла.
  • "MemberExpression" (по умолчанию: 1) навязывает уровень отступа для многострочных цепочек свойств. Это также может быть установлено на "off", чтобы отключить проверку отступа для MemberExpression.
  • "FunctionDeclaration" принимает объект для определения правил для объявлений функций.
    • parameters (по умолчанию: 1) навязывает уровень отступа для параметров в объявлении функции. Это может быть число, обозначающее уровень отступа, или строка "first", указывающая, что все параметры объявления должны быть выровнены с первым параметром. Это также может быть установлено на "off", чтобы отключить проверку параметров FunctionDeclaration.
    • body (по умолчанию: 1) навязывает уровень отступа для тела объявления функции.
  • "FunctionExpression" принимает объект для определения правил для выражений функций.
    • parameters (по умолчанию: 1) навязывает уровень отступа для параметров в выражении функции. Это может быть число, обозначающее уровень отступа, или строка "first", указывающая, что все параметры выражения должны быть выровнены с первым параметром. Это также может быть установлено на "off", чтобы отключить проверку параметров FunctionExpression.
    • body (по умолчанию: 1) навязывает уровень отступа для тела выражения функции.
  • "StaticBlock" принимает объект для определения правил для статических блоков класса.
    • body (по умолчанию: 1) навязывает уровень отступа для тела статического блока класса.
  • "CallExpression" принимает объект для определения правил для выражений вызова функций.
    • arguments (по умолчанию: 1) навязывает уровень отступа для аргументов в выражении вызова. Это может быть число, обозначающее уровень отступа, или строка "first", указывающая, что все аргументы выражения должны быть выровнены с первым аргументом. Это также может быть установлено на "off", чтобы отключить проверку аргументов CallExpression.
  • "ArrayExpression" (по умолчанию: 1) навязывает уровень отступа для элементов в массивах. Может быть установлено на строку "first", указывающую, что все элементы в массиве должны быть выровнены с первым элементом. Это также может быть установлено на "off" для отключения проверки элементов массива.
  • "ObjectExpression" (по умолчанию: 1) навязывает уровень отступа для свойств в объектах. Может быть установлено на строку "first", указывающую, что все свойства в объекте должны быть выровнены с первым свойством. Это также может быть установлено на "off" для отключения проверки свойств объекта.
  • "ImportDeclaration" (по умолчанию: 1) навязывает уровень отступа для инструкций импорта. Может быть установлено на строку "first", указывающую, что все импортированные члены из модуля должны быть выровнены с первым членом в списке. Это также может быть установлено на "off" для отключения проверки импортированных членов модуля.
  • "flatTernaryExpressions": true (по умолчанию false) не требует отступа для условных операторов, вложенных в другие условные операторы.
  • "offsetTernaryExpressions": true (по умолчанию false) требует отступа для значений условных операторов.
  • "ignoreComments" (по умолчанию: false) может использоваться, когда комментарии не должны быть выровнены с узлами на предыдущей или следующей строке.

Уровень отступа обозначает кратное указанному отступу. Пример:

  • Отступ в 4 пробела с VariableDeclarator, установленным на 2, отступит многострочные объявления переменных на 8 пробелов.
  • Отступ в 2 пробела с VariableDeclarator, установленным на 2, отступит многострочные объявления переменных на 4 пробела.
  • Отступ в 2 пробела с VariableDeclarator, установленным на {"var": 2, "let": 2, "const": 3}, отступит многострочные объявления переменных на 4 пробела для var и let, 6 пробелов для const инструкций.
  • Отступ в табуляцию с VariableDeclarator, установленным на 2, отступит многострочные объявления переменных на 2 табуляции.
  • Отступ в 2 пробела с SwitchCase, установленным на 0, не будет отступать case с учётом switch инструкций.
  • Отступ в 2 пробела с SwitchCase, установленным на 1, отступит case на 2 пробела относительно switch инструкций.
  • Отступ в 2 пробела с SwitchCase, установленным на 2, отступит case на 4 пробела относительно switch инструкций.
  • Отступ в табуляцию с SwitchCase, установленным на 2, отступит case на 2 табуляции относительно switch инструкций.
  • Отступ в 2 пробела с MemberExpression, установленным на 0, отступит многострочные цепочки свойств на 0 пробелов.
  • Отступ в 2 пробела с MemberExpression, установленным на 1, отступит многострочные цепочки свойств на 2 пробела.
  • Отступ в 2 пробела с MemberExpression, установленным на 2, отступит многострочные цепочки свойств на 4 пробела.
  • Отступ в 4 пробела с MemberExpression, установленным на 0, отступит многострочные цепочки свойств на 0 пробелов.
  • Отступ в 4 пробела с MemberExpression, установленным на 1, отступит многострочные цепочки свойств на 4 пробела.
  • Отступ в 4 пробела с MemberExpression, установленным на 2, отступит многострочные цепочки свойств на 8 пробелов.

Табуляция

Примеры некорректного кода для этого правила с опцией "tab":

Открыть в игровом поле
/*eslint indent: ["error", "tab"]*/

if (a) {
b=c;
function foo(d) {
e=f;
}
}

Примеры корректного кода для этого правила с опцией "tab":

Открыть в игровом поле
/*eslint indent: ["error", "tab"]*/

if (a) {
	b=c;
	function foo(d) {
		e=f;
	}
}

ignoredNodes

Следующая конфигурация игнорирует отступ для ConditionalExpression (“условного оператора”) узлов:

Примеры корректного кода для этого правила с опцией 4, { "ignoredNodes": ["ConditionalExpression"] }:

Открыть в игровом поле
/*eslint indent: ["error", 4, { "ignoredNodes": ["ConditionalExpression"] }]*/

var a = foo
      ? bar
      : baz;

var a = foo
                ? bar
: baz;

Следующая конфигурация игнорирует отступ в теле IIFE.

Примеры корректного кода для этого правила с опцией 4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }:

Открыть в Playground
/*eslint indent: ["error", 4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }]*/

(function() {

foo();
bar();

})();

Все типы узлов AST можно найти в спецификации ESTree. Вы можете использовать AST Explorer с парсером espree, чтобы изучить дерево AST фрагмента кода.

SwitchCase

Примеры неправильного кода для этой правила с 2, { "SwitchCase": 1 } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "SwitchCase": 1 }]*/

switch(a){
case "a":
    break;
case "b":
    break;
}

Примеры правильного кода для этого правила с 2, { "SwitchCase": 1 } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "SwitchCase": 1 }]*/

switch(a){
  case "a":
    break;
  case "b":
    break;
}

VariableDeclarator

Примеры неправильного кода для этого правила с 2, { "VariableDeclarator": 1 } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": 1 }]*/

var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;

Примеры правильного кода для этого правила с 2, { "VariableDeclarator": 1 } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": 1 }]*/

var a,
  b,
  c;
let d,
  e,
  f;
const g = 1,
  h = 2,
  i = 3;

Примеры правильного кода для этого правила с 2, { "VariableDeclarator": 2 } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": 2 }]*/

var a,
    b,
    c;
let d,
    e,
    f;
const g = 1,
    h = 2,
    i = 3;

Примеры неправильного кода для этого правила с 2, { "VariableDeclarator": "first" } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": "first" }]*/

var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;

Примеры правильного кода для этого правила с 2, { "VariableDeclarator": "first" } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": "first" }]*/

var a,
    b,
    c;
let d,
    e,
    f;
const g = 1,
      h = 2,
      i = 3;

Примеры правильного кода для этого правила с 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }]*/

var a,
    b,
    c;
let d,
    e,
    f;
const g = 1,
      h = 2,
      i = 3;

outerIIFEBody

Примеры неправильного кода для этого правила с опциями 2, { "outerIIFEBody": 0 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "outerIIFEBody": 0 }]*/

(function() {

function foo(x) {
return x + 1;
}

})();

if (y) {
console.log('foo');
}

Примеры правильного кода для этого правила с опциями 2, { "outerIIFEBody": 0 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "outerIIFEBody": 0 }]*/

(function() {

function foo(x) {
  return x + 1;
}

})();

if (y) {
  console.log('foo');
}

Примеры правильного кода для этого правила с опциями 2, { "outerIIFEBody": "off" }:

Открыть в Playground
/*eslint indent: ["error", 2, { "outerIIFEBody": "off" }]*/

(function() {

function foo(x) {
  return x + 1;
}

})();

(function() {

  function foo(x) {
    return x + 1;
  }

})();

if (y) {
  console.log('foo');
}

MemberExpression

Примеры неправильного кода для этого правила с 2, { "MemberExpression": 1 } опциями:

Открыть в Playground
/*eslint indent: ["error", 2, { "MemberExpression": 1 }]*/

foo
.bar
.baz()

Примеры правильного кода для этого правила с 2, { "MemberExpression": 1 } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "MemberExpression": 1 }]*/

foo
  .bar
  .baz();

FunctionDeclaration

Примеры неправильного кода для этого правила с 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/

function foo(bar,
baz,
qux) {
qux();
}

Примеры правильного кода для этого правила с 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/

function foo(bar,
    baz,
    qux) {
  qux();
}

Примеры неправильного кода для этого правила с 2, { "FunctionDeclaration": {"parameters": "first"} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/

function foo(bar, baz,
qux, boop) {
  qux();
}

Примеры правильного кода для этого правила с 2, { "FunctionDeclaration": {"parameters": "first"} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/

function foo(bar, baz,
             qux, boop) {
  qux();
}

FunctionExpression

Примеры неправильного кода для этого правила с 2, { "FunctionExpression": {"body": 1, "parameters": 2} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/

var foo = function(bar,
baz,
qux) {
qux();
}

Примеры правильного кода для этого правила с 2, { "FunctionExpression": {"body": 1, "parameters": 2} } опцией:

Открыть в Playground
/*eslint indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/

var foo = function(bar,
    baz,
    qux) {
  qux();
}

Примеры неправильного кода для этого правила с опцией 2, { "FunctionExpression": {"parameters": "first"} }:

Открыть в Playground
/*eslint indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/

var foo = function(bar, baz,
qux, boop) {
  qux();
}

Примеры правильного кода для этого правила с опцией 2, { "FunctionExpression": {"parameters": "first"} }:

Открыть в Playground
/*eslint indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/

var foo = function(bar, baz,
                   qux, boop) {
  qux();
}

StaticBlock

Примеры неправильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 1} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 1} }]*/

class C {
  static {
foo();
  }
}

Примеры правильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 1} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 1} }]*/

class C {
  static {
    foo();
  }
}

Примеры неправильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 2} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 2} }]*/

class C {
  static {
foo();
  }
}

Примеры правильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 2} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 2} }]*/

class C {
  static {
      foo();
  }
}

CallExpression

Примеры неправильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": 1} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/

foo(bar,
baz,
qux
);

Примеры правильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": 1} }:

Открыть в Playground
/*eslint indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/

foo(bar,
  baz,
  qux
);

Примеры неправильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": "first"} }:

Открыть в Playground
/*eslint indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/

foo(bar, baz,
baz, boop, beep);

Примеры правильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": "first"} }:

Открыть в Playground
/*eslint indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/

foo(bar, baz,
    baz, boop, beep);

ArrayExpression

Примеры неправильного кода для этого правила с опцией 2, { "ArrayExpression": 1 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "ArrayExpression": 1 }]*/

var foo = [
bar,
baz,
qux
];

Примеры правильного кода для этого правила с опцией 2, { "ArrayExpression": 1 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "ArrayExpression": 1 }]*/

var foo = [
  bar,
  baz,
  qux
];

Примеры неправильного кода для этого правила с опцией 2, { "ArrayExpression": "first" }:

Открыть в Playground
/*eslint indent: ["error", 2, {"ArrayExpression": "first"}]*/

var foo = [bar,
baz,
qux
];

Примеры правильного кода для этого правила с опцией 2, { "ArrayExpression": "first" }:

Открыть в Playground
/*eslint indent: ["error", 2, {"ArrayExpression": "first"}]*/

var foo = [bar,
           baz,
           qux
];

ObjectExpression

Примеры неправильного кода для этого правила с опцией 2, { "ObjectExpression": 1 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "ObjectExpression": 1 }]*/

var foo = {
bar: 1,
baz: 2,
qux: 3
};

Примеры правильного кода для этого правила с опцией 2, { "ObjectExpression": 1 }:

Открыть в Playground
/*eslint indent: ["error", 2, { "ObjectExpression": 1 }]*/

var foo = {
  bar: 1,
  baz: 2,
  qux: 3
};

Примеры неправильного кода для этого правила с опцией 2, { "ObjectExpression": "first" }:

Открыть в Playground
/*eslint indent: ["error", 2, {"ObjectExpression": "first"}]*/

var foo = { bar: 1,
baz: 2 };

Примеры правильного кода для этого правила с опцией 2, { "ObjectExpression": "first" }:

Открыть в Playground
/*eslint indent: ["error", 2, {"ObjectExpression": "first"}]*/

var foo = { bar: 1,
            baz: 2 };

ImportDeclaration

Примеры правильного кода для этого правила с опцией 4, { "ImportDeclaration": 1 } (по умолчанию):

Открыть в Playground
/*eslint indent: ["error", 4, { "ImportDeclaration": 1 }]*/

import { foo,
    bar,
    baz,
} from 'qux';
Открыть в Playground
/*eslint indent: ["error", 4, { "ImportDeclaration": 1 }]*/

import {
    foo,
    bar,
    baz,
} from 'qux';

Примеры неправильного кода для этого правила с опцией 4, { "ImportDeclaration": "first" }:

Открыть в Playground
/*eslint indent: ["error", 4, { "ImportDeclaration": "first" }]*/

import { foo,
bar,
baz,
} from 'qux';

Примеры правильного кода для этого правила с опцией 4, { "ImportDeclaration": "first" }:

Открыть в Playground
/*eslint indent: ["error", 4, { "ImportDeclaration": "first" }]*/

import { foo,
         bar,
         baz,
} from 'qux';

flatTernaryExpressions

Примеры неправильного кода для этой правила с параметрами по умолчанию 4, { "flatTernaryExpressions": false }:

Открыть в Playground
/*eslint indent: ["error", 4, { "flatTernaryExpressions": false }]*/

var a =
    foo ? bar :
baz ? qux :
boop;

Примеры правильного кода для этой правила с параметрами по умолчанию 4, { "flatTernaryExpressions": false }:

Открыть в Playground
/*eslint indent: ["error", 4, { "flatTernaryExpressions": false }]*/

var a =
    foo ? bar :
        baz ? qux :
            boop;

Примеры неправильного кода для этой правила с параметром 4, { "flatTernaryExpressions": true }:

Открыть в Playground
/*eslint indent: ["error", 4, { "flatTernaryExpressions": true }]*/

var a =
    foo ? bar :
baz ? qux :
boop;

Примеры правильного кода для этой правила с параметром 4, { "flatTernaryExpressions": true }:

Открыть в Playground
/*eslint indent: ["error", 4, { "flatTernaryExpressions": true }]*/

var a =
    foo ? bar :
    baz ? qux :
    boop;

offsetTernaryExpressions

Примеры неправильного кода для этого правила с параметрами по умолчанию 2, { "offsetTernaryExpressions": false }:

Открыть в Playground
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": false }]*/

condition
  ? () => {
return true
}
  : () => {
false
}

Примеры правильного кода для этого правила с параметрами по умолчанию 2, { "offsetTernaryExpressions": false }:

Открыть в Playground
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": false }]*/

condition
  ? () => {
    return true
  }
  : condition2
    ? () => {
      return true
    }
    : () => {
      return false
    }

Примеры неправильного кода для этого правила с параметром 2, { "offsetTernaryExpressions": true }:

Открыть в Playground
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": true }]*/

condition
  ? () => {
return true
}
  : condition2
    ? () => {
return true
}
    : () => {
return false
}

Примеры правильного кода для этого правила с параметром 2, { "offsetTernaryExpressions": true }:

Открыть в Playground
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": true }]*/

condition
  ? () => {
      return true
    }
  : condition2
    ? () => {
        return true
      }
    : () => {
        return false
      }

ignoreComments

Примеры дополнительного правильного кода для этого правила с параметром 4, { "ignoreComments": true }:

Открыть в Playground
/*eslint indent: ["error", 4, { "ignoreComments": true }] */

if (foo) {
    doSomething();

// comment intentionally de-indented
    doSomethingElse();
}

Совместимость

  • JSHint: indent
  • JSCS: validateIndentation

Версия

Это правило было добавлено в ESLint v0.14.0.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/indent

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API