biomejs / biome

A toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.
https://biomejs.dev
Apache License 2.0
13.94k stars 422 forks source link

💅 useExhaustiveDependencies does not correctly capture dependencies from destructured arrays #3512

Open profaurore opened 1 month ago

profaurore commented 1 month ago

Environment information

CLI:
  Version:                      1.8.3
  Color support:                true

Platform:
  CPU Architecture:             x86_64
  OS:                           windows

Environment:
  BIOME_LOG_DIR:                unset
  NO_COLOR:                     unset
  TERM:                         unset
  JS_RUNTIME_VERSION:           "v21.6.2"
  JS_RUNTIME_NAME:              "node"
  NODE_PACKAGE_MANAGER:         "yarn/1.22.21"

Biome Configuration:
  Status:                       Loaded successfully
  Formatter disabled:           false
  Linter disabled:              false
  Organize imports disabled:    false
  VCS disabled:                 false

Linter:
  JavaScript enabled:           true
  JSON enabled:                 true
  CSS enabled:                  true
  Recommended:                  false
  All:                          true
  Enabled rules:
  style/useImportType
  suspicious/noCatchAssign
  complexity/useLiteralKeys
  nursery/useThrowOnlyError
  suspicious/useNamespaceKeyword
  complexity/noMultipleSpacesInRegularExpressionLiterals
  complexity/noUselessEmptyExport
  suspicious/noAssignInExpressions
  nursery/noYodaExpression
  suspicious/noDuplicateParameters
  correctness/noConstructorReturn
  style/useSelfClosingElements
  style/useTemplate
  correctness/noUnusedLabels
  correctness/noUnreachableSuper
  suspicious/noCompareNegZero
  a11y/noAutofocus
  correctness/noUnsafeOptionalChaining
  correctness/noConstAssign
  nursery/noMisplacedAssertion
  suspicious/noControlCharactersInRegex
  style/noVar
  suspicious/noDoubleEquals
  suspicious/noEmptyInterface
  suspicious/noConstEnum
  nursery/noDuplicateElseIf
  correctness/noPrecisionLoss
  nursery/noUnknownFunction
  correctness/noSetterReturn
  correctness/noInvalidConstructorSuper
  suspicious/noImplicitAnyLet
  a11y/useKeyWithClickEvents
  suspicious/noDuplicateObjectKeys
  suspicious/noUnsafeDeclarationMerging
  correctness/noInnerDeclarations
  correctness/useArrayLiterals
  style/noUselessElse
  complexity/noUselessLabel
  complexity/noUselessCatch
  a11y/useAriaPropsForRole
  style/useCollapsedElseIf
  correctness/noNonoctalDecimalEscape
  suspicious/noDuplicateTestHooks
  complexity/noStaticOnlyClass
  a11y/noInteractiveElementToNoninteractiveRole
  suspicious/noLabelVar
  correctness/noNodejsModules
  suspicious/noApproximativeNumericConstant
  correctness/noUnnecessaryContinue
  nursery/noEmptyBlock
  correctness/noEmptyCharacterClassInRegex
  suspicious/noSparseArray
  a11y/useIframeTitle
  nursery/useDefaultSwitchClause
  a11y/noSvgWithoutTitle
  correctness/noVoidElementsWithChildren
  correctness/useJsxKeyInIterable
  style/useExportType
  complexity/noUselessLoneBlockStatements
  style/noArguments
  a11y/useValidAriaValues
  suspicious/noGlobalAssign
  suspicious/noCommentText
  suspicious/noThenProperty
  suspicious/useGetterReturn
  style/useFragmentSyntax
  a11y/noPositiveTabindex
  style/useNamingConvention
  correctness/noRenderReturnValue
  correctness/useExhaustiveDependencies
  security/noGlobalEval
  a11y/noRedundantRoles
  correctness/noUnusedVariables
  suspicious/noSelfCompare
  nursery/useErrorMessage
  suspicious/noAsyncPromiseExecutor
  security/noDangerouslySetInnerHtml
  style/useNodejsImportProtocol
  suspicious/noArrayIndexKey
  complexity/noWith
  suspicious/noDuplicateClassMembers
  complexity/noExtraBooleanCast
  performance/noAccumulatingSpread
  suspicious/noConfusingLabels
  correctness/noChildrenProp
  nursery/useImportExtensions
  a11y/noAriaUnsupportedElements
  style/noShoutyConstants
  correctness/noFlatMapIdentity
  a11y/noBlankTarget
  a11y/useHeadingContent
  correctness/useValidForDirection
  correctness/noInvalidUseBeforeDeclaration
  a11y/noAriaHiddenOnFocusable
  style/useBlockStatements
  correctness/noInvalidNewBuiltin
  style/noNegationElse
  complexity/useSimplifiedLogicExpression
  nursery/useSortedClasses
  style/noRestrictedGlobals
  style/noNamespaceImport
  style/noUnusedTemplateLiteral
  correctness/noUndeclaredVariables
  style/useExponentiationOperator
  suspicious/useAwait
  nursery/useAdjacentOverloadSignatures
  nursery/noUnknownProperty
  style/noNamespace
  complexity/noUselessFragments
  correctness/noUnusedImports
  suspicious/noFunctionAssign
  performance/noDelete
  suspicious/noUnsafeNegation
  a11y/useValidLang
  nursery/noUndeclaredDependencies
  nursery/noConsole
  a11y/useValidAriaRole
  correctness/noConstantCondition
  a11y/useAriaActivedescendantWithTabindex
  suspicious/useValidTypeof
  style/useDefaultParameterLast
  complexity/noEmptyTypeParameters
  complexity/noUselessTernary
  suspicious/noExplicitAny
  correctness/noSwitchDeclarations
  complexity/noUselessTypeConstraint
  suspicious/noRedundantUseStrict
  style/useLiteralEnumMembers
  nursery/noUselessUndefinedInitialization
  suspicious/noGlobalIsNan
  suspicious/noSkippedTests
  suspicious/noMisleadingCharacterClass
  nursery/noUnmatchableAnbSelector
  nursery/noUnknownSelectorPseudoElement
  correctness/noStringCaseMismatch
  suspicious/noRedeclare
  suspicious/noFallthroughSwitchClause
  nursery/useExplicitLengthCheck
  complexity/noUselessThisAlias
  correctness/noUnreachable
  nursery/noUselessStringConcat
  complexity/noThisInStatic
  complexity/useOptionalChain
  suspicious/noDuplicateCase
  style/noParameterAssign
  nursery/noLabelWithoutControl
  a11y/useValidAnchor
  complexity/useRegexLiterals
  correctness/noSelfAssign
  nursery/useThrowNewError
  style/useShorthandFunctionType
  style/useSingleCaseStatement
  nursery/noUnusedFunctionParameters
  suspicious/noEmptyBlockStatements
  suspicious/noShadowRestrictedNames
  a11y/useMediaCaption
  correctness/noUnsafeFinally
  style/useNodeAssertStrict
  style/useEnumInitializers
  a11y/useHtmlLang
  style/useWhile
  complexity/useArrowFunction
  style/noInferrableTypes
  a11y/noNoninteractiveTabindex
  complexity/useSimpleNumberKeys
  correctness/useYield
  nursery/useTopLevelRegex
  style/useNumericLiterals
  suspicious/noImportAssign
  suspicious/useDefaultSwitchClauseLast
  correctness/noGlobalObjectCalls
  style/noParameterProperties
  a11y/useAltText
  nursery/useNumberToFixedDigitsArgument
  performance/noBarrelFile
  suspicious/noSuspiciousSemicolonInJsx
  complexity/noBannedTypes
  suspicious/noPrototypeBuiltins
  style/useAsConstAssertion
  suspicious/noDebugger
  suspicious/noMisleadingInstantiator
  complexity/noVoid
  suspicious/noDuplicateJsxProps
  correctness/noEmptyPattern
  nursery/noDuplicateJsonKeys
  complexity/noExcessiveNestedTestSuites
  performance/noReExportAll
  a11y/useKeyWithMouseEvents
  nursery/useConsistentBuiltinInstantiation
  security/noDangerouslySetInnerHtmlWithChildren
  suspicious/noExtraNonNullAssertion
  style/useConst
  style/noNonNullAssertion
  complexity/useFlatMap
  correctness/useHookAtTopLevel
  correctness/useIsNan
  suspicious/noGlobalIsFinite
  complexity/noExcessiveCognitiveComplexity
  a11y/noDistractingElements
  nursery/useFocusableInteractive
  style/useConsistentArrayType
  style/useForOf
  a11y/useValidAriaProps
  a11y/noRedundantAlt
  nursery/useSemanticElements
  nursery/useGenericFontNames
  suspicious/noConfusingVoidType
  suspicious/noFocusedTests
  a11y/useButtonType
  nursery/useDateNow
  style/useFilenamingConvention
  style/useShorthandArrayType
  style/useShorthandAssign
  correctness/noConstantMathMinMaxClamp
  correctness/noUnusedPrivateClassMembers
  correctness/noVoidTypeReturn
  a11y/useAnchorContent
  complexity/noUselessRename
  style/useNumberNamespace
  complexity/noUselessConstructor
  a11y/noAccessKey
  complexity/noUselessSwitchCase
  nursery/noUnknownUnit
  style/noDefaultExport
  style/useSingleVarDeclarator
  suspicious/noExportsInTest
  a11y/noNoninteractiveElementToInteractiveRole
  style/noCommaOperator
  suspicious/useIsArray
  a11y/noHeaderScope
  correctness/noNewSymbol
  suspicious/noMisrefactoredShorthandAssign
  complexity/noForEach
  suspicious/noClassAssign
  nursery/noEvolvingTypes

Rule name

lint/correctness/useExhaustiveDependencies

Playground link

https://biomejs.dev/playground/?indentStyle=space&quoteStyle=single&jsxQuoteStyle=single&lintRules=all&code=aQBtAHAAbwByAHQAIAB7ACAAdQBzAGUAUwB0AGEAdABlACwAIAB1AHMAZQBFAGYAZgBlAGMAdAAgAH0AIABmAHIAbwBtACAAJwByAGUAYQBjAHQAJwAKAAoALwAvACAAUAByAG8AYgBsAGUAbQAKAGYAdQBuAGMAdABpAG8AbgAgAFMAdABhAHQAZQBBAHIAcgBhAHkARABlAHMAdAByAHUAYwB0AHUAcgBlACgAKQAgAHsACgAgACAAYwBvAG4AcwB0ACAAWwBbAHgALAAgAHkAXQAsACAAcwBlAHQAWABZAF0AIAA9ACAAdQBzAGUAUwB0AGEAdABlACgAWwAxACwAIAAyAF0AKQA7AAoAIAAgAHUAcwBlAEUAZgBmAGUAYwB0ACgAKAApACAAPQA%2BACAAewAKACAAIAAgACAAYwBvAG4AcwBvAGwAZQAuAGwAbwBnACgAeAAsACAAeQApAAoAIAAgAH0ALAAgAFsAeAAsACAAeQBdACkAOwAKAAoAIAAgAHIAZQB0AHUAcgBuACAAbgB1AGwAbAAKAH0ACgAKAC8ALwAgAFAAcgBvAGIAbABlAG0ACgBmAHUAbgBjAHQAaQBvAG4AIABTAHQAYQB0AGUAQQByAHIAYQB5AEQAZQBzAHQAcgB1AGMAdAB1AHIAZQBXAGkAdABoAE0AaQBzAHMAaQBuAGcAKAApACAAewAKACAAIABjAG8AbgBzAHQAIABbAFsAeAAsACAAeQBdACwAIABzAGUAdABYAFkAXQAgAD0AIAB1AHMAZQBTAHQAYQB0AGUAKABbADEALAAgADIAXQApADsACgAgACAAdQBzAGUARQBmAGYAZQBjAHQAKAAoACkAIAA9AD4AIAB7AAoAIAAgACAAIABjAG8AbgBzAG8AbABlAC4AbABvAGcAKAB4ACwAIAB5ACkACgAgACAAfQAsACAAWwB4AF0AKQA7AAoACgAgACAAcgBlAHQAdQByAG4AIABuAHUAbABsAAoAfQAKAAoALwAvACAATwBrAAoAZgB1AG4AYwB0AGkAbwBuACAAQQByAHIAYQB5AEQAZQBzAHQAcgB1AGMAdAB1AHIAZQAoACkAIAB7AAoAIAAgAGMAbwBuAHMAdAAgAFsAeAAsACAAeQBdACAAPQAgAFsATQBhAHQAaAAuAHIAYQBuAGQAbwBtACgAKQAsACAATQBhAHQAaAAuAHIAYQBuAGQAbwBtACgAKQBdADsACgAgACAAdQBzAGUARQBmAGYAZQBjAHQAKAAoACkAIAA9AD4AIAB7AAoAIAAgACAAIABjAG8AbgBzAG8AbABlAC4AbABvAGcAKAB4ACwAIAB5ACkACgAgACAAfQAsACAAWwB4ACwAIAB5AF0AKQA7AAoACgAgACAAcgBlAHQAdQByAG4AIABuAHUAbABsAAoAfQAKAAoALwAvACAATwBrAAoAZgB1AG4AYwB0AGkAbwBuACAAUwB0AGEAdABlAE8AYgBqAGUAYwB0AEQAZQBzAHQAcgB1AGMAdAB1AHIAZQAoACkAIAB7AAoAIAAgAGMAbwBuAHMAdAAgAFsAewAgAHgALAAgAHkAIAB9ACwAIABzAGUAdABYAFkAXQAgAD0AIAB1AHMAZQBTAHQAYQB0AGUAKAB7ACAAeAA6ACAAMQAsACAAeQA6ACAAMgAgAH0AKQA7AAoAIAAgAHUAcwBlAEUAZgBmAGUAYwB0ACgAKAApACAAPQA%2BACAAewAKACAAIAAgACAAYwBvAG4AcwBvAGwAZQAuAGwAbwBnACgAeAAsACAAeQApAAoAIAAgAH0ALAAgAFsAeAAsACAAeQBdACkAOwAKAAoAIAAgAHIAZQB0AHUAcgBuACAAbgB1AGwAbAAKAH0ACgAKAC8ALwAgAE8AawAKAGYAdQBuAGMAdABpAG8AbgAgAE8AYgBqAGUAYwB0AEQAZQBzAHQAcgB1AGMAdAB1AHIAZQAoACkAIAB7AAoAIAAgAGMAbwBuAHMAdAAgAFsAeAAsACAAeQBdACAAPQAgAHsAIAB4ADoAIABNAGEAdABoAC4AcgBhAG4AZABvAG0AKAApACwAIAB5ADoAIABNAGEAdABoAC4AcgBhAG4AZABvAG0AKAApACAAfQA7AAoAIAAgAHUAcwBlAEUAZgBmAGUAYwB0ACgAKAApACAAPQA%2BACAAewAKACAAIAAgACAAYwBvAG4AcwBvAGwAZQAuAGwAbwBnACgAeAAsACAAeQApAAoAIAAgAH0ALAAgAFsAeAAsACAAeQBdACkAOwAKAAoAIAAgAHIAZQB0AHUAcgBuACAAbgB1AGwAbAAKAH0ACgAKAC8ALwAgAE8AawAKAGYAdQBuAGMAdABpAG8AbgAgAFMAdABhAHQAZQBJAG4AZABlAHAAZQBuAGQAZQBuAHQAVgBhAHIAaQBhAGIAbABlAHMAKAApACAAewAKACAAIABjAG8AbgBzAHQAIABbAHgALAAgAHMAZQB0AFgAXQAgAD0AIAB1AHMAZQBTAHQAYQB0AGUAKAAxACkAOwAKACAAIABjAG8AbgBzAHQAIABbAHkALAAgAHMAZQB0AFkAXQAgAD0AIAB1AHMAZQBTAHQAYQB0AGUAKAAyACkAOwAKACAAIAB1AHMAZQBFAGYAZgBlAGMAdAAoACgAKQAgAD0APgAgAHsACgAgACAAIAAgAGMAbwBuAHMAbwBsAGUALgBsAG8AZwAoAHgALAAgAHkAKQAKACAAIAB9ACwAIABbAHgALAAgAHkAXQApADsACgAKACAAIAByAGUAdAB1AHIAbgAgAG4AdQBsAGwACgB9AAoACgAvAC8AIABPAGsACgBmAHUAbgBjAHQAaQBvAG4AIABJAG4AZABlAHAAZQBuAGQAZQBuAHQAVgBhAHIAaQBhAGIAbABlAHMAKAApACAAewAKACAAIABjAG8AbgBzAHQAIAB4ACAAPQAgAE0AYQB0AGgALgByAGEAbgBkAG8AbQAoACkAOwAKACAAIABjAG8AbgBzAHQAIAB5ACAAPQAgAE0AYQB0AGgALgByAGEAbgBkAG8AbQAoACkAOwAKACAAIAB1AHMAZQBFAGYAZgBlAGMAdAAoACgAKQAgAD0APgAgAHsACgAgACAAIAAgAGMAbwBuAHMAbwBsAGUALgBsAG8AZwAoAHgALAAgAHkAKQAKACAAIAB9ACwAIABbAHgALAAgAHkAXQApADsACgAKACAAIAByAGUAdAB1AHIAbgAgAG4AdQBsAGwACgB9AA%3D%3D

Expected result

Values from destructured state arrays should be required dependencies.

const [[a, b], setPair] = useState([1, 2]);
useEffect(() => {
  console.log(a, b);
}, [a, b]);

Code of Conduct

yossydev commented 1 month ago

I saw the link playground.

// Problem
function StateArrayDestructureWithMissing() {
  const [[x, y], setXY] = useState([1, 2]);
  useEffect(() => {
    console.log(x, y);
  }, [x]);

  return null;
}

Are you saying that the problem is that it is not an error to include y in the deps at this time?👀

profaurore commented 1 month ago

Are you saying that the problem is that it is not an error to include y in the deps at this time?👀

Yes. That is correct.

yossydev commented 1 month ago

I'm understand. I checked useExhaustiveDependencies, Indeed this may not have been checked