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 @@ + + + +