diff --git a/.changeset/silent-pugs-speak.md b/.changeset/silent-pugs-speak.md
new file mode 100644
index 000000000..81ae7c7cc
--- /dev/null
+++ b/.changeset/silent-pugs-speak.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': minor
+---
+
+fix: broken indentation of if condition in `svelte/indent` rule
diff --git a/packages/eslint-plugin-svelte/src/rules/indent-helpers/es.ts b/packages/eslint-plugin-svelte/src/rules/indent-helpers/es.ts
index 583222a51..a0d684521 100644
--- a/packages/eslint-plugin-svelte/src/rules/indent-helpers/es.ts
+++ b/packages/eslint-plugin-svelte/src/rules/indent-helpers/es.ts
@@ -30,9 +30,9 @@ export function defineVisitor(context: IndentContext): NodeListener {
const { sourceCode, offsets, options } = context;
/**
- * Find the root of left node.
+ * Find the head of chaining nodes.
*/
- function getRootLeft(
+ function getChainHeadNode(
node:
| TSESTree.AssignmentExpression
| TSESTree.AssignmentPattern
@@ -49,13 +49,20 @@ export function defineVisitor(context: IndentContext): NodeListener {
parent.type === 'LogicalExpression')
) {
const prevToken = sourceCode.getTokenBefore(target);
- if (prevToken && isOpeningParenToken(prevToken)) {
+ const nextToken = sourceCode.getTokenAfter(target);
+ if (
+ prevToken &&
+ isOpeningParenToken(prevToken) &&
+ nextToken &&
+ isClosingParenToken(nextToken)
+ ) {
+ // The chain is broken because it is enclosed in parentheses.
break;
}
target = parent;
parent = getParent(target);
}
- return target.left;
+ return target;
}
const visitor = {
@@ -116,17 +123,22 @@ export function defineVisitor(context: IndentContext): NodeListener {
| TSESTree.BinaryExpression
| TSESTree.LogicalExpression
) {
- const leftNode = getRootLeft(node);
+ const baseNode = getChainHeadNode(node);
const opToken = sourceCode.getTokenAfter(node.left, {
filter: isNotClosingParenToken,
includeComments: false
})!;
+ const baseToken =
+ baseNode.type === 'AssignmentExpression' || baseNode.type === 'AssignmentPattern'
+ ? sourceCode.getFirstToken(baseNode)
+ : getFirstAndLastTokens(sourceCode, baseNode).firstToken;
+ const leftToken = getFirstAndLastTokens(sourceCode, node.left).firstToken;
const rightToken = getFirstAndLastTokens(sourceCode, node.right).firstToken;
offsets.setOffsetToken(
- [opToken, rightToken],
+ [leftToken === baseToken ? null : leftToken, opToken, rightToken],
1,
- getFirstAndLastTokens(sourceCode, leftNode).firstToken
+ baseToken
);
},
AssignmentPattern(node: TSESTree.AssignmentPattern) {
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-errors.yaml
new file mode 100644
index 000000000..f46928188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-errors.yaml
@@ -0,0 +1,304 @@
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 3
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 4
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 5
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 6
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 7
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 8
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 9
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 10
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 11
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 12
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 13
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 14
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 15
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 16
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 17
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 18
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 19
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 20
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 21
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 22
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 23
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 24
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 25
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 26
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 27
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 28
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 29
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 30
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 31
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 32
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 33
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 34
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 35
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 36
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 37
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 38
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 39
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 40
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 41
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 42
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 43
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 44
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 45
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 46
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 47
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 48
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 49
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 50
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 51
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 52
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 53
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 54
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 55
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 56
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 57
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 58
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 59
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 60
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 61
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 62
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 63
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 64
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 65
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 66
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 67
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 68
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 69
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 70
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 71
+ column: 1
+ suggestions: null
+- message: Expected indentation of 10 spaces but found 0 spaces.
+ line: 72
+ column: 1
+ suggestions: null
+- message: Expected indentation of 6 spaces but found 0 spaces.
+ line: 73
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 74
+ column: 1
+ suggestions: null
+- message: Expected indentation of 8 spaces but found 0 spaces.
+ line: 75
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 76
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 77
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 78
+ column: 1
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-input.svelte
new file mode 100644
index 000000000..ad54142e2
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-input.svelte
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-output.svelte
new file mode 100644
index 000000000..b74e19b50
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary02-output.svelte
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-errors.yaml
new file mode 100644
index 000000000..f7bbe896b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-errors.yaml
@@ -0,0 +1,24 @@
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 3
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 4
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 5
+ column: 1
+ suggestions: null
+- message: Expected indentation of 4 spaces but found 0 spaces.
+ line: 6
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 7
+ column: 1
+ suggestions: null
+- message: Expected indentation of 2 spaces but found 0 spaces.
+ line: 8
+ column: 1
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-input.svelte
new file mode 100644
index 000000000..8d711f59c
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-input.svelte
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-output.svelte
new file mode 100644
index 000000000..774983999
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/script-binary03-output.svelte
@@ -0,0 +1,11 @@
+
+
+
+