From 8676dca4c03dd818e95a3fb36e01a6e6a0bd7e2b Mon Sep 17 00:00:00 2001 From: baseballyama Date: Wed, 19 Mar 2025 20:35:39 +0900 Subject: [PATCH] fix(no-unused-props): resolve false positives on props with default values or $bindable usage --- .changeset/few-singers-marry.md | 5 +++++ .../src/rules/no-unused-props.ts | 15 +++++++++++---- .../no-unused-props/valid/bindable-input.svelte | 9 +++++++++ .../valid/default-value-input.svelte | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 .changeset/few-singers-marry.md create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/bindable-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/default-value-input.svelte diff --git a/.changeset/few-singers-marry.md b/.changeset/few-singers-marry.md new file mode 100644 index 000000000..4e924dfd1 --- /dev/null +++ b/.changeset/few-singers-marry.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix(no-unused-props): resolve false positives on props with default values or $bindable usage diff --git a/packages/eslint-plugin-svelte/src/rules/no-unused-props.ts b/packages/eslint-plugin-svelte/src/rules/no-unused-props.ts index 5de3133c0..2ea58fd87 100644 --- a/packages/eslint-plugin-svelte/src/rules/no-unused-props.ts +++ b/packages/eslint-plugin-svelte/src/rules/no-unused-props.ts @@ -369,10 +369,17 @@ export default createRule('no-unused-props', { if (node.id.type === 'ObjectPattern') { usedProps = getUsedPropertiesFromPattern(node.id); if (usedProps.size === 0) return; - const identifiers = node.id.properties - .filter((p): p is TSESTree.Property => p.type === 'Property') - .map((p) => p.value) - .filter((v): v is TSESTree.Identifier => v.type === 'Identifier'); + const identifiers: TSESTree.Identifier[] = []; + for (const p of node.id.properties) { + if (p.type !== 'Property') { + continue; + } + if (p.value.type === 'Identifier') { + identifiers.push(p.value); + } else if (p.value.type === 'AssignmentPattern' && p.value.left.type === 'Identifier') { + identifiers.push(p.value.left); + } + } for (const identifier of identifiers) { const paths = getUsedNestedPropertyNames(identifier); usedPaths.push(...paths.map((path) => [identifier.name, ...path])); diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/bindable-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/bindable-input.svelte new file mode 100644 index 000000000..ef2c5e990 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/bindable-input.svelte @@ -0,0 +1,9 @@ + + + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/default-value-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/default-value-input.svelte new file mode 100644 index 000000000..48d6887f4 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-props/valid/default-value-input.svelte @@ -0,0 +1,14 @@ + + +
+
+ {newTaskAttributes.attribute} + {newTaskAttributes.attribute2} +
+