From d9d06b7466393c29b24a13369e81ca8b6f2c8de6 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Fri, 19 Dec 2025 21:44:13 +0000 Subject: [PATCH] fix: exclude objects/spread from `prefer-spread-syntax` Excludes `Array.from(...args)` and `Array.from({ anything })` since we can't iterate objects. Fixes #30. --- src/rules/prefer-spread-syntax.test.ts | 5 +++++ src/rules/prefer-spread-syntax.ts | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rules/prefer-spread-syntax.test.ts b/src/rules/prefer-spread-syntax.test.ts index 4d58183..33eff2a 100644 --- a/src/rules/prefer-spread-syntax.test.ts +++ b/src/rules/prefer-spread-syntax.test.ts @@ -21,6 +21,11 @@ ruleTester.run('prefer-spread-syntax', preferSpreadSyntax, { 'Array.from(iterable, x => x * 2);', 'Array.from(arr, mapper);', + // Array.from with object literal or spread + 'Array.from({length: 5});', + 'Array.from({length: N}).fill(0);', + 'Array.from(...args).fill(0)', + // Already using spread 'const arr = [...iterable];', diff --git a/src/rules/prefer-spread-syntax.ts b/src/rules/prefer-spread-syntax.ts index aecb9de..ec4ed8c 100644 --- a/src/rules/prefer-spread-syntax.ts +++ b/src/rules/prefer-spread-syntax.ts @@ -63,9 +63,15 @@ export const preferSpreadSyntax: Rule.RuleModule = { node.callee.property.name === 'from' && node.arguments.length === 1 ) { - const iterableText = sourceCode.getText(node.arguments[0]!); - replacement = `[...${iterableText}]`; - messageId = 'preferSpreadArrayFrom'; + const firstArg = node.arguments[0]!; + if ( + firstArg.type !== 'SpreadElement' && + firstArg.type !== 'ObjectExpression' + ) { + const iterableText = sourceCode.getText(firstArg); + replacement = `[...${iterableText}]`; + messageId = 'preferSpreadArrayFrom'; + } } // Object.assign({...}, ...) else if (